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'

in case并发分布式写

MongoDB不支持分布式写。写入总是到主服务器,所以不可能有任何冲突,理论上

然而,这并不完全正确——如果你在主服务器宕机之前写入主服务器,有可能写在主服务器的日志中,但没有写入辅助服务器,并且你的客户端代码没有得到响应。在这种(罕见的)情况下,你会有冲突。MongoDB通过在服务器恢复时将bson文件放在名为rollback的特殊文件夹中来处理。

除了复制集的复杂性之外,操作总是按顺序执行的(同样,对于复制集,顺序由主服务器的时钟决定)。正如JohnnyHK已经指出的,更新可以执行选择性更新,如$inc$set,或替换整个文档。什么有意义取决于您的应用程序。如果您执行了大量的$inc s,例如对于命中计数器,那么顺序并不重要,但是当您执行替换时,它当然会起作用。在这种情况下,根据上面的说明,最后一次写操作获胜。一般来说,我认为应该考虑对象所有权,即谁真正被允许替换文档。

如果你想有mvcc(多版本并发控制)的行为,例如允许不同的用户写相同的(逻辑)文档与变更跟踪(类似git),你可能想看看monomvcc。只有在应用程序级别需要并发性时,这才有意义,这样用户就可以直接处理不同的版本/分支。

最新更新