我需要在我的mongodb上执行一些操作(读取和写入),而不会让另一个进程中断。它适用于在线游戏,当用户向另一个用户发送资源时,会执行以下步骤:
我担心在检查它是否足够或插入资源事务时,已经插入了一些其他事务并且值变为无效。如何确保按此顺序执行此部分?
答案 0 :(得分:3)
我可以看到两种方式:
使用客户端交易持有"锁定":http://docs.mongodb.org/manual/tutorial/perform-two-phase-commits/
或者在此处使用版本控制,您可以在其中保存一个$inc
版本号的字段,每次保存时都会更新,并且必须在每次保存时查询。 Vermongo就是一个很好的例子:https://github.com/thiloplanz/v7files/wiki/Vermongo
这些似乎是我看到的两个最合理的方式。
答案 1 :(得分:1)
在谈论mongo时,交易是一个几乎被禁止的词。但是,您可以使用带有$inc
的原子uptade,使用资源值作为条件来执行步骤1,2和4,然后执行步骤3和5.如果后续步骤失败,您将无法支持回滚步骤。 / p>
答案 2 :(得分:1)
我是Tokutek的工程师
TokuMX是一个MongoDB替换服务器,它使用相同的协议和驱动程序,并支持非分片设置上的本机多语句事务。您可以使用可序列化的事务来完成所需的操作,该事务将对您触摸的文档进行文档级锁定。这可以像
那样完成> db.beginTransaction("serializable");
> if (resourcesInsufficient()) { db.rollbackTransaction(); }
> // insert and update
> db.commitTransaction()
同样,分片不支持此功能,但可能对您的应用程序有用。讨论了更多细节,功能和限制here。