MongoDB 中文手册

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

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

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

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

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

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

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

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

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

按照这个顺序

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

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

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

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

自己写 读取1S2读取数据,返回的数据反映的状态等于Write 1,然后回滚Write 1
单调读 读取2S3读取数据,该数据反映读取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,请更新qty50
阅读项目A
对于qty小于或等于的项目50
更新restocktrue
阅读项目A

按此顺序:

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

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

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

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

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

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

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

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

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

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

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

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

4.阅读2与读取关注"local"S3
对于项目A,请更新qty50
阅读项目A
对于qty小于或等于的项目50
更新restocktrue
阅读项目A
使用读关注本地和写关注1的具有两个主数据的数据状态
❌自己写 读取2S3读取数据,该数据仅反映写入2之后的状态,而不反映写入1 之后是写入2的状态
❌单调读 读取2S3读取数据,该数据不反映读取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,请更新qty50
阅读项目A
对于qty小于或等于的项目50
更新restocktrue
阅读项目A
使用读关注本地和写关注多数的两个主数据的状态
❌阅读自己的文章。 1读取数据S1是WRITE1后没有反映的状态1
❌单调读。 读取2S3读取数据,该数据不反映读取1之后的状态(即,较早的状态不反映读取1读取的数据)。
✅单调写道 2更新P数据,以反映写1之后的状态。
❌写跟随阅读。 2更新P新的数据,该数据不反映读1之后的状态(即,较早的状态不反映读1读取的数据)。