3

我不完全理解这两个功能在(WiredTiger)MongoDB 程序中如何相互关联:

1) WiredTiger 快照

2) 数据锁定

如果使用 WiredTiger 引擎的每个读取操作在读取时都提供了数据库级别的“快照”(以创建一致性(ACID 中的 C),那么为什么我们还需要锁定?让我们举个例子。

我在文档级别执行查询(读取操作)。好的,所以我知道我得到了数据库级别的快照,因此即使另一个用户同时写入同一个文档并更新它,我的数据也是一致

那么在这一点上,在该文档上设置共享锁有什么用,它会阻止对该文档的所有写入(独占)操作,直到共享锁被释放?如果我实际上使用的是在阅读时提供给我的文档快照,那么在我阅读该文档的同时写入该文档可能会出现什么问题?为什么我会关心在我的读取操作期间文档是否被锁定?我已经有了那个时间点的(一致的)数据,不是吗?

我显然在这里错过了一个关键概念......有什么帮助吗?

谢谢。

4

1 回答 1

6

您是对的,读取操作将获取快照。使用 WiredTiger 存储引擎时,MongoDB 不会读取或写入锁定单个文档。相反,WiredTiger 使用多版本并发控制,MVCC。执行文档更新时,只要文档的版本与获取快照时的版本相同,该更新就会成功。如果没有,WiredTiger 将返回一个错误(WT_ROLLBACK),表明更新存在写冲突。在这种情况下,更新将中止,所有待处理的更改都将撤消。然后,MongoDB 将透明地重试该操作。

于 2018-05-09T21:10:31.020 回答