MongoDB 中文手册

读关注"majority"和写关注{w: 1}

如果因果一致性暗示持久性,则在因果一致性会话中使用读取关注"majority"和写入关注 可提供以下因果一致性保证:{ w: 1 }

❌读取自己的写入ton单调读取ton单调写入✅写入跟随读取

如果因果一致性并不意味着持久性:

✅读取自己的写入ton单调读取ton单调写入✅写入跟随读取

方案3(“关注多数”和“关注关注” ){w: 1}

在过渡期内有两个初选,因为无论P老与P新能满足与写入 的写入关注,一个客户端会话可以成功地发出以下的操作序列,但不是因果关系一致,如果一致因果意味着耐久性:{ w: 1 }

序列 例
1.写1与写入关注 到 老{ w: 1 }P
2.读1与读关心"majority"到S2
3.写2到新的写关注{ w: 1 }P

4.阅读2与读取关注"majority"到S3
对于项目A,请更新qty为50。
阅读项目A。
对于qty小于或等于的项目50,
更新restock到true。
阅读项目A。
具有两个主数据的数据状态,其中使用读关注多数和写关注1

按照这个顺序

  • 阅读1不能返回,直到大部分提交点已经推进了P新的过去写的时候1。
  • 阅读2不能返回,直到大部分提交点已经推进了P新的过去写的时间2。
  • 网络分区修复后,写入1将回滚。

➤ 如果因果一致性意味着持久性

❌ 自己写 读取1从S2读取的数据不反映写入1之后的状态。
✅ 单调读 读取2从S3读取数据,该数据反映读取1之后的状态(即,较早的状态反映在读取1读取的数据中)。
❌ 单调写道 写2更新关于P新数据的数据,该数据不会反映写1之后的状态。
✅ 写跟随读 写2更新P新数据,以反映读1之后的状态(即,较早的状态反映读1读取的数据)。

➤ 如果因果一致性并不意味着持久性

✅ 自己写 读取1从S2读取数据,返回的数据反映的状态等于Write 1,然后回滚Write 1。
✅ 单调读 读取2从S3读取数据,该数据反映读取1之后的状态(即,较早的状态反映在读取1读取的数据中)。
✅ 单调写道 写2更新Pnew上的数据,这等效于写1之后回退写1的数据。
✅ 写跟随读 写2更新P新数据,以反映读1之后的状态(即,其较早的状态反映读1读取的数据)。

方案4(“关注多数”和“关注关注” ){w: 1}

考虑一个替代序列,其中具有读关注点的读1"majority"路由到S1:

序列 例
1.写1与写入关注 到 老{ w: 1 }P
2.读1与读出关切"majority"到S1
3.写2到新的写关注{ w: 1 }P

4.阅读2与读取关注"majority"到S3
对于项目A,请更新qty为50。
阅读项目A。
对于qty小于或等于的项目50,
更新restock到true。
阅读项目A。

按此顺序:

  • 直到多数提交点前进到1之前,读取1不会返回。在old和1可以与副本集的其余部分通信之前,不会发生这种情况。这时,old已下台(如果尚未退出),Write 1从old和1回滚,并且两个成员与副本集的其他成员同步。SPSPPS

➤ 如果因果一致性意味着持久性

❌ 自己写 读取1读取的数据不反映已回退的写入1的结果。
✅ 单调读 读取2从S3读取数据,该数据反映读取1之后的状态(即,其较早的状态反映读取1读取的数据)。
❌ 单调写道 写2更新关于Pnew的数据,该数据不反映写1之后的状态,该状态早于写2但已回滚。
✅ 写跟随读 写2更新P新数据,以反映读1之后的状态(即,其较早的状态反映读1读取的数据)。

➤ 如果因果一致性并不意味着持久性

✅ 自己写 读1返回反映写1最终结果的数据,因为写1最终会回滚。
✅ 单调读 读取2从S3读取数据,该数据反映读取1之后的状态(即,较早的状态反映读取1读取的数据)。
✅ 单调写道 写2更新Pnew上的数据,这等效于写1之后回退写1的数据。
✅ 写跟随读 写2更新P新数据,以反映读1之后的状态(即,较早的状态反映读1读取的数据)。

读关注"local"和写关注{w: 1}

在因果一致的会话中使用读关注"local"和写关注 不能保证因果一致性。{ w: 1 }

❌读取自己的写入ton单调读取ton单调写入❌写入跟随读取

在某些情况下(但不一定在所有情况下),此组合可以满足所有四个因果一致性保证。

方案5(“本地”和“关注”的关注点){w: 1}

在这个短暂的时期,因为无论P老与 P新能满足与写入的写入关注,一个客户端会话可以发出以下的操作序列成功,但不是因果关系是一致的:{ w: 1 }

序列 例
1.写1与写入关注 到 老{ w: 1 }P
2.读1与读出关切"local"到S1
3.写2到新的写关注{ w: 1 }P

4.阅读2与读取关注"local"到S3
对于项目A,请更新qty为50。
阅读项目A。
对于qty小于或等于的项目50,
更新restock到true。
阅读项目A。
使用读关注本地和写关注1的具有两个主数据的数据状态
❌自己写 读取2从S3读取数据,该数据仅反映写入2之后的状态,而不反映写入1 之后是写入2的状态。
❌单调读 读取2从S3读取数据,该数据不反映读取1之后的状态(即,较早的状态不反映读取1读取的数据)。
❌单调写道 写2更新关于P新数据的数据,该数据不会反映写1之后的状态。
❌写跟随读 写2更新P新的数据,该数据不反映读1之后的状态(即,较早的状态不反映读1读取的数据)。

读关注"local"和写关注"majority"

在因果一致的会话中使用读取关注"local"和写入关注 "majority"可提供以下因果一致性保证:

❌读取自己的写入ton单调读取ton单调写入❌写入跟随读取

在某些情况下(但不一定在所有情况下),此组合可以满足所有四个因果一致性保证。

方案6(“关注本地”和“关注多数”)

在此过渡期间,因为只有Pnew才能满足 写关注的写操作,所以客户机会话可以成功发出以下操作序列,但因果关系不一致:{ w: "majority" }

序列 例
1.写1"majority" 到 新的关注P
2.读1与读出关切"local"到S1
3.写2"majority" 到新的写关注P

4.阅读2与读取关注"local"到S3
对于项目A,请更新qty为50。
阅读项目A。
对于qty小于或等于的项目50,
更新restock到true。
阅读项目A。
使用读关注本地和写关注多数的两个主数据的状态
❌阅读自己的文章。 读1读取数据S1是WRITE1后没有反映的状态1。
❌单调读。 读取2从S3读取数据,该数据不反映读取1之后的状态(即,较早的状态不反映读取1读取的数据)。
✅单调写道 写2更新P新数据,以反映写1之后的状态。
❌写跟随阅读。 写2更新P新的数据,该数据不反映读1之后的状态(即,较早的状态不反映读1读取的数据)。