This is my blog.
考虑一个系统使用混合逻辑时钟 HLC 实现因果一致性。每个节点维护一个数据,事务使用 2PC 保证原子提交。每个事务有开始时间戳 $T.sts$、准备时间戳 $T.pts$ 提交时间戳 $T.cts$。
考虑只有三个事务执行: $$ T_1={W(x,1),W(z,1)}\ T_2={R(x,1), W(y,2)}\ T_3={R(x,1), R(y,2), R(z,_)} $$ 根据上述条件,推测 $T_3$ 读到的 $z$ 必是 1 而不能是初始值。
由于存在这样的情况:节点 $z$ 上,$T_1$ 进入准备阶段但还未收到协调者的提交信息,收到了 $T_3$ 的读请求并返回了初始值 $z=0$。虽然客观上有 $T_1.pts \le T_1.cts < T_3.sts$,但是由于节点 $z$ 还未收到协调者的提交信息,因此节点上只有 $T_1.pts < T_3.sts$,此时应该阻塞 $T_3$ 的读直到 $T_1$ 提交。
下面的公理描述了因果一致性(CC)和前缀一致性(PC),其中 VIS 表示可见关系,AR 是全局仲裁序。
[
TransVis(T) \equiv; & \forall T', S \in \T.;T' \rel{\VIS} S \land S \rel{\VIS} T
\implies T' \rel{\VIS} T. \
Prefixaxiom(T) \equiv; & \forall T', S \in \T.;
T' \rel{\AR} S \land S \rel{\VIS} T \implies T' \rel{\VIS} T
]
我们已经知道,HLC 实现的是 CC 而非 PC。考虑如下的 long fork 异常,这是在 CC 下允许而 PC 下不允许的,请结合 HLC 的实现解释 CC 为什么会产生这样的异常。
[
T_1={W(x,1)}\
T_2={W(y,2)}\
T_3={R(x,1), R(y,0)}\
T_4={R(x,0), R(y,2)}\
]