“多数提交数据”和“多数提交数据的快照”有什么区别

gao*_*ols 5 transactions mongodb

多数提交数据多数提交数据的快照之间有什么区别,我应该关心它吗?如果这两个概念完全不同,何时以及如何选择一个?

我在阅读有关 mongodb 中事务的参考时发现了这些描述:https://docs.mongodb.com/manual/core/transactions/#transaction-options-read-concern-write-concern-read-preference,但我不明白之间的差别readConcern: majorityreadConcern: snapshot

Mar*_*ara 5

不幸的是,文档确实将这些概念视为理所当然,但差异并不那么容易理解。我什至不确定我是否正确,但 Aly Cabral 在她关于分布式事务的演讲中举了这个例子。

\n

如果我指定readConcern: snapshot,那么我将在所有分片上拥有一致的时间点。

\n

在此输入图像描述

\n

相反,如果我指定readConcern: localreadConcern: majority,那么每个分区都会有一致的快照。

\n

在此输入图像描述

\n

她最后说readConcern: snapshot,在分片集群中协调快照查找可能会很昂贵,因此您应该权衡每种方法的利弊readConcern

\n
\n

她做了一个很好的例子,这些图片确实对我有帮助,但我认为有必要补充一下:

\n
    \n
  • 显示的字段time指的是ClusterTime1:这是基于混合逻辑时钟的集群范围逻辑时钟。每个分片的主分片都有自己的ClusterTime价值,并遵守以下规则:

    \n
    \n

    ClusterTime 增量规则:\n仅当有\n写入主节点\xe2\x80\x99s 复制操作日志\n(oplog) 时,ClusterTime 才会递增 (\xe2\x80\x9cticks\xe2\x80\x9d)。\ ClusterTime 分布规则:\ n集群节点(mongod、mongos、配置服务器、客户端)\n在发送消息时\n始终跟踪并包含最大的已知 ClusterTime。

    \n
    \n

    如果在第二张图中,ClusterTime交易的编号选择为 102,则具有ClusterTime110 的分片可能会包含我不希望在交易期间看到的多数提交的更改。从 MongoDB 5.0 开始,这个时间是可配置的:

    \n
    readConcern: {\n    level: "snapshot",\n    atClusterTime: Timestamp(1613577600, 1)\n}\n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
\n

我正在写一份关于 MongoDB 事务的报告,其中解释了这些概念和许多其他概念。如果您发现错误/需要改进的地方,我将非常感谢任何人的帮助。

\n
\n

1: https: //dl.acm.org/doi/pdf/10.1145/3299869.3314049

\n