Mysql MongoDB读/写锁

Mysql MongoDB读/写锁,mysql,node.js,mongodb,mongoose,locking,Mysql,Node.js,Mongodb,Mongoose,Locking,我计划使用nodejs创建一个应用程序,用户可以对产品进行评分。据我所知,mongodb中的锁与mySql中的锁不同 我担心如果10个用户同时对一个产品进行投票,Mongodb无法处理,其他用户看到的结果也不正确 我看了类似的问题,但我还是很困惑!mongodb是一个不错的选择还是我应该只使用Mysql?非常感谢您的帮助MongoDB文档中介绍了锁定。特别是: MongoDB使用允许并发读取的读写器锁 对数据库的访问,但提供对单个写入的独占访问 手术 当存在读锁时,许多读操作可能会使用此锁。 但

我计划使用nodejs创建一个应用程序,用户可以对产品进行评分。据我所知,mongodb中的锁与mySql中的锁不同

我担心如果10个用户同时对一个产品进行投票,Mongodb无法处理,其他用户看到的结果也不正确


我看了类似的问题,但我还是很困惑!mongodb是一个不错的选择还是我应该只使用Mysql?非常感谢您的帮助

MongoDB文档中介绍了锁定。特别是:

MongoDB使用允许并发读取的读写器锁 对数据库的访问,但提供对单个写入的独占访问 手术

当存在读锁时,许多读操作可能会使用此锁。 但是,当存在写锁时,单个写操作将保持 以独占方式锁定,其他读取或写入操作不能共享 锁

锁是“编写器贪婪的”,这意味着写锁具有优先权 过度阅读。当读和写都在等待锁时,MongoDB 将锁授予写操作

关于你的声明:

Mongodb无法处理它,其他用户看到的结果不正确


MongoDB使用一个数据库范围的锁,在数据库中的某个地方执行写操作时防止读/写。从外观上看,这将在将来简化为集合级锁(现在只是开发版本)。此外,由于“编写器贪婪”的方法,如果多个写操作等待执行,它们将在任何读取之前完成,因此您的担心不应该成为问题

对单个文档的任何写入操作都保证是原子操作。它要么完全成功,要么根本不成功,请求同一文档的客户端保证获得处于一致状态的同一文档的副本

对于批量操作,默认情况下并非如此。通常,如果在一次操作中更新10个文档,那么其他操作可能会在更新之间交替进行。您可以通过使用操作符来隔离操作,以确保没有其他人可以在不一致的状态下查看该文档集

从更一般的意义上讲,MongoDB使用readers-writer锁,这样您就可以非常确定,如果客户机a在客户机B读取文档之前更新了文档,那么B将看到writer a的更新。当然,其中的一些问题将归结于驱动程序的实现以及如何使用它,但对于任何数据库来说都是如此

分布式环境
以上仅适用于您谈论的单个实例。一旦有了分布式mongo设置,我们就开始讨论。MongoDB的一个重要特性是它的伸缩性能够很好地处理庞大的数据集。这通常使用分片、副本集或两者来完成。在这两种情况下,MongoDB最终都是一致的。在分布式设置中,客户端B可能会读取缺少客户端a更新的文档,因为MongoDB选择可用性而不是一致性。最终,所有这些不一致性都将得到解决,并且在实践中,对于大多数用例来说,它通常是足够一致的。但是当它在分布式环境中安装时,它不能做出任何保证。

这个问题需要一些澄清。你说的“不能处理它”到底是什么意思?@关于并发性,我指的所有20个问题mongo是否会在开始下一次写入之前创建一个写入队列并等待每一次写入完成?我认为你忽略了真正的问题。锁定很好,但是隔离可能会有问题——正如您所说,如果多个用户同时尝试“投票”,您可能会遇到麻烦,具体取决于您实现的方式。检查SO()中的问题和答案2018年的状况值得一提-在wildtiger(mongo 3.2中的默认引擎)中,存在文档级锁定。