在并发分布式写入的情况下,MongoDB如何处理插入/更新/删除合并冲突?

时间:2014-03-11 12:14:24

标签: mongodb

如果并发分布式写入,Mongodb如何处理插入/更新/删除合并冲突?

插入内容:

op1: insert( { _id : 'joe', age : 30 } )
op2: insert( { _id : 'joe', age : 33 } )

删除:

op1: set( { _id : 'joe', age : 40 } }
op2: delete( { _id : 'joe' } )
op3: set( { _id : 'joe', age : 33 } )

更新

p1: update users set age=40 where _id='joe'
op2: update users set state='ca' where _id='joe'

1 个答案:

答案 0 :(得分:5)

  

以防并发分布式写入

MongoDB不支持分布式写入。写always go to the primary,因此不存在任何冲突,理论上

然而,这并非完全正确 - 如果你在初级版本发布之前写信给初级版本,那么写作可能是在主要期刊中但却没有它是次要的,你的客户代码没有得到回应。在那种(罕见的)情况下,你会发生冲突。 MongoDB通过在服务器恢复时放置bson file in a special folder named rollback来处理它。

除了复制集的复杂性之外,操作总是按顺序执行(其中,对于副本集,顺序由主要时钟确定)。正如JohnnyHK已经指出的那样,更新可以执行选择性更新,例如$inc$set,或者替换整个文档。有意义取决于您的应用程序。如果你执行了很多$inc s,例如对于点击计数器,顺序并不重要,但当然,当您执行替换时它确实如此。在这种情况下,从上面开始,最后一次写入获胜。一般来说,我认为应该把一些东西放到对象所有权中,即谁真的被允许替换文档。

如果您想要具有类似MVCC(多版本并发控制)的行为,例如允许不同的用户使用更改跟踪(类似git)写入相同(逻辑)文档,您可能需要查看MongoMVCC。只有在应用程序级别需要并发时才有意义,因此您的用户可以直接处理不同的版本/分支。