我并不完全理解(WiredTiger) MongoDB程序中这两个特性是如何相互关联的:
1) WiredTiger快照
2)数据锁定
如果每次使用WiredTiger引擎的读取操作在读取时都提供了数据库级的“快照”(以便创建一致性(C在ACID中)),那么为什么我们也需要锁定呢?让我们举个例子。
我在文档级别(读取操作)执行查询。好的,所以我知道我得到了数据库级别的快照,所以我的数据是一致的,即使另一个用户正在并发地写入同一文档,并对其进行更新。
那么,在这个文档上设置一个共享锁有什么用呢?在发布共享锁之前,它会阻止该文档上的所有写(独占)操作?当我同时阅读该文档时,如果我正在使用在读取时提供给我的文档的快照,那么在并发写入该文档时会有什么问题呢?为什么我会关心文件是否锁定在我的阅读操作期间?我已经从那个时间点得到了(一致的)数据,不是吗?
我显然错过了一个关键的概念..。有什么帮助吗?
谢谢。
发布于 2018-05-09 21:10:31
读取操作将获得快照,这是正确的。当使用WiredTiger存储引擎时,MongoDB不会锁定单独的文档,无论是读还是写。相反,WiredTiger使用多版本并发控制( MVCC ).在执行文档更新时,只要文档具有与获取快照时相同的版本,该更新就会成功。如果没有,WiredTiger将返回一个错误(WT_ROLLBACK),指示更新有写冲突。在这种情况下,更新将中止,所有挂起的更改都将撤消。然后,MongoDB将透明地重试该操作。
https://stackoverflow.com/questions/50261447
复制相似问题