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

 同步管理精英 发布于 2023-01-18 18:09

在并发分布式写入的情况下,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,或替换整个文档.有意义取决于您的应用程序.如果你执行了很多$incs,例如对于点击计数器,顺序无关紧要,但当然,当你执行替换时它也是如此.在这种情况下,从上面开始,最后一次写入获胜.一般来说,我认为应该将一些内容放入对象所有权中,即谁真的被允许替换文档.

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

1 个回答
  • 以防并发分布式写入

    MongoDB不支持分布式写入.写入始终是主要的,因此理论上不会有任何冲突.

    然而,这并不完全正确 - 如果你在它发生故障之前写入主数据库,那么写入可能是在主要的日志中,但是没有进入辅助服务器而你的客户端代码没有得到响应.在那种(罕见的)情况下,你会发生冲突.MongoDB通过将bson文件放在rollback服务器重新启动时命名的特殊文件夹中来处理它.

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

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

    2023-01-18 18:10 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有