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(使用前将#替换为@)