我不完全理解这两个特性在(wiredtiger)MongoDB程序中是如何相互关联的:
1)线图快照
2)数据锁定
如果在读取时,使用wiredtiger引擎的每个读取操作都提供了一个数据库级的“快照”(以便创建一致性(acid中的c),那么为什么我们还需要锁定?我们举个例子。
我在文档级别执行查询(读取操作)。好的,我知道我得到了数据库级的快照,这样即使另一个用户同时写入同一个文档并更新它,我的数据也是一致的。
因此,在这一点上,在该文档上拥有一个共享锁有什么用呢?它将阻塞该文档上的所有写(独占)操作,直到共享锁被释放为止?如果我实际上使用了在读取时提供给我的文档快照,那么在我读取文档的同时写入该文档可能会出现什么问题?为什么我会在意文档在我的读取操作期间是否被锁定?我已经有了那个时间点的(一致的)数据,不是吗?
很明显我遗漏了一个关键的概念…有什么帮助吗?
谢谢。

最佳答案

读取操作将获取快照,这是正确的。使用wiredtiger存储引擎时,mongodb不会锁定单个文档进行读写操作。相反,wiredtiger使用多版本并发控制mvcc。在执行文档更新时,只要文档的版本与获取快照时的版本相同,则该更新将成功。否则,wiredtiger将返回一个错误(wt_rollback),指示更新有写冲突。在这种情况下,更新将中止,所有挂起的更改都将撤消。MongoDB将透明地重试该操作。

07-24 09:46
查看更多