我不完全理解这两个功能在 (WiredTiger) MongoDB 程序中如何相互关联:
1) WiredTiger 快照
2)数据锁定
如果使用WiredTiger引擎的每个读操作在读时都提供了数据库级别的“快照”(以便创建一致性(ACID中的C),那么为什么我们还需要锁定?让我们举个例子。
我在文档级别执行查询(读取操作)。好的,所以我知道我得到了数据库级快照,这样我的数据是一致的EVEN IF另一个用户正在同时写入同一个文档并更新它。
那么此时,在该文档上拥有共享锁有什么用处,它会阻止该文档上的所有写(独占)操作,直到共享锁被释放?如果我实际上使用的是在阅读时提供给我的文档快照,那么在阅读该文档时同时写入该文档可能会出现什么问题?为什么我要关心文档在读操作期间是否被锁定?我已经有了那个时间点的(一致的)数据,不是吗?
我显然在这里错过了一个关键概念......有什么帮助吗?
Thanks.
您是对的,读取操作将获取快照。当使用WiredTiger存储引擎时,MongoDB会not锁定单个文档的读取或写入。相反,WiredTiger 使用多版本并发控制 (MVCC)。执行文档更新时,只要文档的版本与获取快照时的版本相同,更新就会成功。如果没有,WiredTiger 将返回错误 (WT_ROLLBACK),指示更新存在写入冲突。在这种情况下,更新将中止并且所有挂起的更改都将被撤消。然后 MongoDB 将透明地重试该操作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)