【问题标题】:MongoDB - WiredTiger Snapshots vs. LockingMongoDB - WiredTiger 快照与锁定
【发布时间】:2018-05-09 20:22:57
【问题描述】:

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

1) WiredTiger 快照

2) 数据锁定

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

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

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

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

谢谢。

【问题讨论】:

    标签: database mongodb concurrency wiredtiger


    【解决方案1】:

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

    【讨论】:

    • GeertB,我是否可以安全地得出以下结论:1) 文档级锁定和 2) MVCC 是两种不同的协议/工具,目的相同,但 WiredTiger 团队只是选择实施后者?还有那 WiredTiger 只使用后者?
    • 是的。 MongoDB 文档和源代码中提到“文档级锁定”的地方,实际上是指文档级并发控制:实际方法取决于每个存储引擎。 WiredTiger 确实只使用 MVCC 进行文档级并发控制。
    猜你喜欢
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多