在并发分布式写入的情况下,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'
mnemosyn.. 5
以防并发分布式写入
MongoDB不支持分布式写入.写入始终是主要的,因此理论上不会有任何冲突.
然而,这并不完全正确 - 如果你在它发生故障之前写入主数据库,那么写入可能是在主要的日志中,但是没有进入辅助服务器而你的客户端代码没有得到响应.在那种(罕见的)情况下,你会发生冲突.MongoDB通过将bson文件放在rollback
服务器重新启动时命名的特殊文件夹中来处理它.
除了复制集的复杂性之外,操作总是按顺序执行(其中,对于副本集,顺序由主要时钟确定).正如JohnnyHK已经指出的那样,更新可以执行选择性更新,如$inc
或$set
,或替换整个文档.有意义取决于您的应用程序.如果你执行了很多$inc
s,例如对于点击计数器,顺序无关紧要,但当然,当你执行替换时它也是如此.在这种情况下,从上面开始,最后一次写入获胜.一般来说,我认为应该将一些内容放入对象所有权中,即谁真的被允许替换文档.
如果您希望具有类似MVCC(多版本并发控制)的行为,例如允许不同的用户使用更改跟踪(类似git)写入相同(逻辑)文档,您可能需要查看MongoMVCC.只有在应用程序级别需要并发时,这才有意义,因此您的用户可以直接处理不同的版本/分支.
以防并发分布式写入
MongoDB不支持分布式写入.写入始终是主要的,因此理论上不会有任何冲突.
然而,这并不完全正确 - 如果你在它发生故障之前写入主数据库,那么写入可能是在主要的日志中,但是没有进入辅助服务器而你的客户端代码没有得到响应.在那种(罕见的)情况下,你会发生冲突.MongoDB通过将bson文件放在rollback
服务器重新启动时命名的特殊文件夹中来处理它.
除了复制集的复杂性之外,操作总是按顺序执行(其中,对于副本集,顺序由主要时钟确定).正如JohnnyHK已经指出的那样,更新可以执行选择性更新,如$inc
或$set
,或替换整个文档.有意义取决于您的应用程序.如果你执行了很多$inc
s,例如对于点击计数器,顺序无关紧要,但当然,当你执行替换时它也是如此.在这种情况下,从上面开始,最后一次写入获胜.一般来说,我认为应该将一些内容放入对象所有权中,即谁真的被允许替换文档.
如果您希望具有类似MVCC(多版本并发控制)的行为,例如允许不同的用户使用更改跟踪(类似git)写入相同(逻辑)文档,您可能需要查看MongoMVCC.只有在应用程序级别需要并发时,这才有意义,因此您的用户可以直接处理不同的版本/分支.