MongoDB读/写锁

时间:2014-10-29 19:16:06

标签: mysql node.js mongodb mongoose locking

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

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

我看了类似的问题,但我仍然感到困惑! mongodb是一个不错的选择还是我应该使用Mysql?我很感激你的帮助

2 个答案:

答案 0 :(得分:5)

在MongoDB文档中的Concurrency FAQ中描述了锁定。特别是:

  

MongoDB使用允许并发读取的reader-writer锁   访问数据库,但可以独占访问单个写入   操作

     

当存在读锁时,许多读操作可能会使用此锁。   但是,当存在写锁定时,单个写操作会保持   独占锁定,没有其他读写操作可以共享   锁。

     

锁是“作家贪心”,这意味着写锁具有偏好   读取。当读取和写入都在等待锁定时,MongoDB   授予锁定写入权。

关于你的陈述:

  

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

MongoDB采用数据库范围的锁,可防止在数据库中某处执行写操作时进行读/写操作。通过this JIRA item的外观,这将在未来简化为集合级锁定(现在它只是在开发版本中)。此外,由于“作家贪婪”的方法,如果等待执行多次写入,它们将在任何读取之前完成,因此您的关注不应成为问题。

答案 1 :(得分:3)

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

对于批量操作,默认情况下不是这种情况。通常,如果您在单个操作中更新10个文档,则其他操作可能会在更新之间进行交错。您可以使用$isolated运算符来隔离操作,以确保没有其他人可以在不一致的状态下查看该组文档。

在更一般的意义上,MongoDB使用writer-greedy读者 - 作者锁定,这样您就可以非常确定如果客户端A在客户端B读取之前更新文档,那么B将看到作者A的更新。其中一些将归结为驱动程序的实现以及如何使用它,当然,任何数据库都是如此。

分布式环境

以上内容仅适用于您讨论的实例。一旦你有分布式 mongo设置,我们就开始讨论CAP theorem。 MongoDB的一个重要特性是规模处理大量数据集的能力如何。这通常使用分片,副本集或两者来完成。在任何一种情况下,MongoDB都被称为最终一致。在分布式设置中,客户端B可能会读取缺少客户端A更新的文档,因为MongoDB会选择可用性而不是一致性。最终,所有这些不一致性都会被解决,实际上它通常对大多数用例来说都足够一致。但是当它在分布式环境中设置时,它无法做出任何保证。