我计划使用nodejs创建一个应用程序,让用户对产品进行评分。据我所知,mongodb中的锁与mysql不同。
我担心如果有10个用户同时对一个产品进行投票,Mongodb无法处理,其他用户看到的结果可能不正确。
我查看了类似的问题,但仍然感到困惑!MongoDB是一个好选择还是应该只使用MySQL?感谢您的帮助。
我计划使用nodejs创建一个应用程序,让用户对产品进行评分。据我所知,mongodb中的锁与mysql不同。
我担心如果有10个用户同时对一个产品进行投票,Mongodb无法处理,其他用户看到的结果可能不正确。
我查看了类似的问题,但仍然感到困惑!MongoDB是一个好选择还是应该只使用MySQL?感谢您的帮助。
在MongoDB文档的并发FAQ中介绍了锁定。特别是:
MongoDB使用读写锁,允许对数据库进行并发读取操作,但只允许单个写操作进行独占式访问。
当存在读锁时,许多读操作可以使用此锁。然而,当存在写锁时,单个写操作将独占地持有锁,没有其他读或写操作可以共享该锁。
锁是“写入优先”,这意味着写入锁具有优先权而不是读取。当一个读和一个写都在等待锁时,MongoDB将锁授予写入。
因此,关于您的陈述:
MongoDB采用数据库级锁定,防止在数据库的某个位置执行写操作时进行读/写操作。从this JIRA item看来,这将在未来减少到集合级别锁定(现在仅适用于开发版本)。此外,由于“写入者贪婪”方法,如果有多个写操作等待执行,则会在任何读取之前执行它们,因此您不必担心。Mongodb无法处理它,其他用户看到的结果不正确。
任何对于单个文档的写操作都保证是原子性的。它要么完全成功,要么完全失败,并且请求同一文档的客户端将获得一个处于一致状态的该文档副本。
对于批量操作,默认情况下不是这种情况。通常,如果您在单个操作中更新了10个文档,则其他操作可能会在更新之间交错。您可以使用$isolated运算符来隔离操作,以确保没有人能够以不一致的状态查看那组文档。
在更一般的意义上,MongoDB使用writer-greedy读者-写者锁,因此您可以相当确定,如果客户端A在客户端B读取它之前更新了一个文档,则B将看到作者A的更新。当然,其中一些要归结于驱动程序的实现方式及其使用方式,但这对于任何数据库都是正确的。