如何使用 MongoDB 转移资金?

2024-02-16

Account has embedded
  Transactions
    amount (positive for received transactions, negative for outgoing transactions)

用户想要汇款。我们需要计算账户余额来检查是否有足够的钱。在伪代码中:

send_money(amount)
  balance = sum(account's all transactions) // Mongo Query 1
  if (amount <= balance)
    add a new transaction to account // Mongo Query 2

但是两个并发的 mongo 连接是否有可能同时传递查询 1 并继续执行查询 2?假设用户的余额为 1,并且两个价值为 1 的并发发送资金请求同时通过查询 1 并成功添加到交易中。实际上,用户最终的余额为 -1。

如何防止这种情况发生?


当您的用例需要跨越多个文档的事务时,MongoDB 通常不适合它,因为当多个文档受到影响时,它不支持原子操作。

一个可能的解决方法是两阶段提交 http://docs.mongodb.org/manual/tutorial/perform-two-phase-commits/ model.

它基本上意味着您首先添加您想要对每个文档执行的操作的描述作为附加字段。然后,您对每个文档执行原子操作,应用该操作并删除描述。这些步骤中的每一个都通过事后查询文档来确认,并且交易的每个步骤都由待处理交易的附加集合中的第三个文档记录。这允许您检查待处理的事务并将其回滚。

这种方法实现起来比较困难,而且开销很大。在实现此操作之前,您应该真正考虑是否确实有充分的理由不使用具有本机事务支持的数据库系统。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 MongoDB 转移资金? 的相关文章

  • 单笔交易与多笔交易[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 猫鼬查找并删除

    我正在尝试删除满足查询的多个文档 但是 我需要这些文档的数据将它们存储在单独的集合中以实现撤消功能 我让它工作的唯一方法是使用多个查询 Data find query exec function err data Data remove q
  • java.lang.IllegalArgumentException:在 MongoDB 中执行聚合的引用无效

    我收集了一份文件 id ObjectId 5ab273ed31fa764560a912f8 hourNumber 21 errorSegments agentName agentX agentName agentY 我正在尝试在 Sprin
  • 对开始和结束范围进行分组和计数

    如果我有以下格式的数据 id 1 startDate ISODate 2017 01 1T00 00 00 000Z endDate ISODate 2017 02 25T00 00 00 000Z type CAR id 2 startD
  • Spring Data - MongoDB 索引 DBRef

    我正在使用 spring data mongodb 1 2 0 RELEASE 我有两个类 A 和 B 其中 B 引用了 A 并且用 DBRef 进行了注释 Class A Document collection a public clas
  • 将位置数据存储在 Mongodb 文档中

    在我当前的项目中 我将位置数据以以下格式存储在 Mongodb 文档中 location loc lng 118 15592692 lat 34 03566804 geocode city East Los Angeles state CA
  • Python GIL 防止多核机器中 CPU 使用率超过 100%?

    许多参考文献都说 Python GIL 降低了多核机器中多线程代码的性能 因为每个线程在执行之前都需要获取 GIL 换句话说 看起来GIL实际上是将多线程Python程序变成了单线程模式 例如 1 线程A获得GIL 执行一段时间 释放GIL
  • 如何在 mongodb-native findAndModify 中使用变量作为字段名称?

    在使用 mongodb native 驱动程序的这段代码中 我想增加在单独变量中指定的字段的值 问题在于 在这种情况下 inc 子句中的字段名称将是 变量 而不是变量的内容 在查询部分中 所选变量按预期工作并找到正确的 ID var sel
  • mongoid 中的嵌入文档与哈希数据类型

    我找不到任何讨论此问题的博客文章或文档 它们 嵌入式文档和哈希数据类型 非常相似 彼此相比有何好处或限制 考虑我的架构设计 class HistoryTracker include Mongoid Document include Mong
  • 将 mongo 数组转换为具有键值对的对象

    我有一个包含字符串数组的 mongo 文档 我需要将这个特定的字符串数组转换为包含键值对的对象数组 以下是我目前的做法 id ObjectId 57e3720836e36f63695a2ef2 platform A1 available C
  • MongoDB 将数字转换为科学计数法的字符串

    我想获得完整的号码String 但反而 1490650000000 它返回科学计数法 1 49065e 12 这是我尝试转换它的方法 substr myNumber 0 1 有什么想法如何预防吗 Note 我使用的是v3 6 无法升级使用
  • MongoDB的ObjectId是如何生成的?

    他们是吗somewhat随机的 我的意思是 人们能够将它们分开吗 它们不是随机的 可以很容易地预测 BSON ObjectID 是一个 12 字节值 由 4 字节时间戳组成 自纪元以来的秒数 一个 3 字节 机器 ID 2 字节进程 ID
  • 错误:键 $conditionalHandlers 不得以 '$' mongodb 开头

    我对 mongodb 特别是 Node js 的 mongoose 包有疑问 我有以下架构 var Schema mongoose Schema var location new Schema nomville type String re
  • 多文档事务在使用 mongodb 4.08 社区服务器的 C# 中不起作用

    我需要使用 mongodb 事务更新多个文档 mongodb 社区服务器版本是 4 08 net 的 mongodb 驱动程序是 2 9 beta 也尝试过 2 8 从调试中 我可以看到它执行了 session AbortTransacti
  • 如何在java中创建mongoDB objectid

    参考帖子如何使用 Java 将数组添加到 MongoDB 文档 https stackoverflow com questions 15371839 how to add an array to a mongodb document usi
  • 为 MongoDB 中的对象数组建立索引

    我有一个巨大的电子邮件转储 我正在尝试在 MongoDB 中存储和查询它 有 160 万封电子邮件 每封电子邮件都存储为节点模块 https github com andris9 mailparser它将原始电子邮件解析为漂亮的 Javas
  • 清理 MongoDB 的输入

    我正在为 MongoDB 数据库程序编写 REST 接口 并尝试实现搜索功能 我想公开整个 MongoDB 接口 我确实有两个问题 但它们是相关的 所以我将它们放在一篇文章中 使用 Python json 模块解码不受信任的 JSON 是否
  • 在 shell/shell 脚本中设置 MongoDB 写关注

    我正在尝试填充一个集合MongoDB的壳 据我了解 使用轻松的Write Concern可以大大加快这个过程 我说的是文档 http docs mongodb org manual core write concern write oper
  • Spring Data mongodb:添加 MongoDb 访问凭据

    我的 Spring 应用程序中有以下工作配置
  • $unwind聚合框架中的对象

    在 MongoDB 聚合框架中 我希望在对象 即 JSON 集合 上使用 unwind 运算符 看起来不像是这样possible http docs mongodb org manual reference aggregation S un

随机推荐

  • C++ 中的可空值

    我正在用本机 C 创建数据库访问层 并且正在寻找支持 NULL 值的方法 这是我到目前为止所拥有的 class CNullValue public static CNullValue Null static CNullValue nv re
  • UITextView contentInset 在 iOS 7 上的 UITextView 中不起作用?

    我正在尝试设置一个UITextView s contentInset财产 这样做时 UIEdgeInset s top变量工作得很好 所以 self textView setContentInset UIEdgeInsetsMake 50
  • C# 中的链接属性和意外结果

    我只是快速浏览了一下本文 http blogs msdn com ricom archive 2006 09 07 745085 aspx 特别是关于为什么他选择使用结构 字段而不是类 属性 并看到这一行 属性的结果不是真正的左值 因此我们
  • 同步算法

    有什么好的同步算法参考吗 我对在多个用户之间同步以下类型数据的算法感兴趣 日历 文件 列表和大纲 我不仅仅是在寻找目录内容的同步a la rsync http en wikipedia org wiki Rsync 我有兴趣合并单个文件中的
  • 如何在 Angular2 材质表中映射动态标题和表内容

    我在带有动态表内容和标题的 Angular 材料表中遇到问题 这是我的表的 JSON 数据 let dataobj key Data1 value ENF key Data2 value 10598489700 key Data3 valu
  • 滚动RecyclerView时Cardview的数据发生变化

    我是一名初级 Android 开发者 我用 CardView 制作了一个应用程序 但是当我滚动 RecyclerView 时 它正在更改其内容 Video http sendvid com 60ui8cay http sendvid com
  • 如何强制复选框的文本不换行?

    这就是我的 LinearLayout 水平 行的样子 我希望复选框的文本在一行上 按钮不必那么宽 它们仍然有足够的空间 并且复选框文本稍微加长 我的 XML 中的内容
  • 仅列出当前目录中超过 x 天的所有文件

    我是 unix 新手 在其他问题中无法得到适当的结果 我只想列出当前目录中早于 x 天的文件 我有以下限制 仅列出当前文件夹中早于 30 的文件 天 输出不应包含目录和子目录 这应该列出类似于 ls 命令的文件 输出应该是这样的file1
  • Objective-C:何时知道您正在滥用全局变量的 SIngleton 方法

    因此 我的客户 iPhone 应用程序在过去几周内已从 5 个左右的课程增加到超过 25 个课程 对于如此大的 无论如何对于 iPhone 来说 类结构 我一直在利用 Singleton 类来访问全局变量 问题是 每当我需要访问我正在处理的
  • NSString、NSNumber 类型属性中,保留还是复制哪个更好? (NSArray 怎么样?)

    如果对象具有 type 属性NSString or NSNumber 哪个更好 retain or copy 我认为这些对象是不可变的 不能改变对象的状态 所以复制更好 我看到了为什么复制比分配 NSMutableString 并更改它更好
  • 如何在数据库级别为一对多关联设置唯一性?

    我的问题很简单 但我找不到任何 GORM 语法 考虑下面的类 class Article String text static hasMany tags String static constraints tags unique true
  • 如何分配给锯齿状数组?

    我正在编写一个简短的程序 最终将玩四连棋 到目前为止 pastebin https pastebin com wk5crs7g 有一个部分不起作用 我在第 16 行声明了一个锯齿状数组 char board Enumerable Repea
  • 将 Eclipse 工作区从 ~ 移动到新目录?

    好吧 我犯了一个错误 将我的主目录 又名 home user 设置为 RHEL6 机器上的工作区位置 我想将我的工作空间更改为 workspace 但是 我似乎无法通过复制文件来做到这一点 对于一些背景 我当前正在处理并已在 工作区下完全设
  • java.lang.NoSuchFieldError:DEF_CONTENT_CHARSET

    我正在尝试运行 java 程序 但收到以下运行时错误 错误如下所示 Exception in thread main java lang NoSuchFieldError DEF CONTENT CHARSET at org apache
  • Elastic Search:常规过滤器和条件过滤器

    我正在使用弹性搜索 带有查询 match all 和过滤 在我的情况下 我想应用通用过滤器并按条件过滤 这里是伪的 查询 匹配所有 工作正常 过滤 d1 和 d2 之间的日期范围 没有项目符号 3 也能正常工作 过滤器 仅在字段存在时应用
  • 为什么存在“DatabaseGenerateOption.None”?

    这与使用Property gt p HasDatabaseGeneratedOption 称呼 是否可能关闭默认数据库值生成 EF uses DatabaseGeneratedOption找出如何处理新实体的键列的值 如果DatabaseG
  • 类型“PromiseLike”上不存在属性“catch”

    我在以下代码中收到此错误 我正在使用 ionic3 类型 PromiseLike 上不存在属性 catch 这是链接到tutorial https www youtube com watch v 1wU9N7VxoS8我正在关注 此错误显示
  • JTextField 固定高度

    我如何获得JTextField当框架最大化时有固定的高度 我希望它看起来有点类似于 Ubuntu 上的 Skype 应用程序 private JTextField username private JPasswordField passwo
  • 使用 dplyr / tidyverse 删除基于多列的重复行?

    我想使用 dplyr tidyverse 删除基于 gt 1 列的重复行 Example library dplyr df lt data frame a c 1 1 1 2 2 2 b c 1 2 1 2 1 2 stringsAsFac
  • 如何使用 MongoDB 转移资金?

    Account has embedded Transactions amount positive for received transactions negative for outgoing transactions 用户想要汇款 我们