Mongodb Mongo事务和更新

Mongodb Mongo事务和更新,mongodb,Mongodb,如果我的环境中有多个相同客户机的实例连接到MongoDB服务器,并且我想要一个简单的锁定机制来确保短时间内单个客户机的访问,那么我可以安全地使用我自己的锁对象吗 假设我有一个对象具有可以锁定或解锁的锁定状态,计划是每个人在做事情之前检查它是否已解锁。要锁定系统,我说: db.collection.update{lockState:unlocked},{lockState:locked} aka UPDATE lockObj SET lockState='locked',其中lockState='

如果我的环境中有多个相同客户机的实例连接到MongoDB服务器,并且我想要一个简单的锁定机制来确保短时间内单个客户机的访问,那么我可以安全地使用我自己的锁对象吗

假设我有一个对象具有可以锁定或解锁的锁定状态,计划是每个人在做事情之前检查它是否已解锁。要锁定系统,我说:

db.collection.update{lockState:unlocked},{lockState:locked}

aka UPDATE lockObj SET lockState='locked',其中lockState='unlocked'

如果两个客户端同时尝试锁定系统,是否可能两个客户端都认为自己拥有锁

两个客户端都通过更新的查询参数查找记录 客户端1更新作为原子操作的记录 更新返回成功 客户端2更新文档—在客户端1修改文档之前,它已经找到了该文档 更新返回成功 我意识到这可能是一个非常做作的案例,很难重现,但mongo是否有可能或是否以某种方式使客户端2的更新失败

替代方法 使用插入而不是更新。insert是原子的,如果文档已经存在,则将失败

要锁定系统:db.locks.insert{someId:27,state:“locked”}。 如果插入成功-我得到了锁,因为更新是原子的,没有其他人可以拥有它。 如果插入失败-必须有其他人拥有锁

如果两个客户端同时尝试锁定系统,是否可能两个客户端都认为自己拥有锁

否,根据您的版本和配置,一次只能有一个客户端写入锁空间全局、数据库、集合或文档,并且该锁空间上的操作是连续的,一个或另一个客户端读取或写入,不是每个文档都有,这样其他连接就不会错误地拾取处于中间状态的文档,并认为它没有被其他客户端锁定


单个文档上的所有操作都是原子操作,无论是更新还是插入。

等等,您是否有意将数据库从多线程向下钻取到单线程?这就是第一段所说的……感谢@Sammaye-将其缩回到最简单的形式:更新查询+修改是原子的?@John3136的确,每个文档,因为多文档更新不会覆盖整个更新,而是覆盖它通过的每个文档