MongoDB - WiredTiger 快照与锁定

MongoDB - WiredTiger Snapshots vs. Locking

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

1) WiredTiger 快照

2) 数据锁定

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

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

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

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

谢谢。

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