我知道我在交易中的公平份额以及它周围的毛病(在我大学期间专注于它)但我从来没有把这个交易:
我有一组由两个进程(节点)创建的(分布式)事务。
及时看起来像这样:
P1: |--------------------A----------------------|
P2: |--------B-------||------------C---------------|
所以现在有趣的是:
无干扰情景:
A开始,B开始。 B改变A从未读过的东西.B提交,C启动,也不干扰A,A提交完成。
即使C失败或B失败,A仍然可以提交。
B取决于方案
A与B一起开始.B现在读取A已经改变的东西,因此B依赖于A.B提交。现在C启动,A失败,导致C和B回滚。
由于B已经提交,因此无法判断自B承诺后现在由A设置的停止信息是否已被提供给外部。所以我认为B依赖于A并且它的提交会延迟到A已经提交的时间点,因为它是未提交的读取?
A取决于B场景
A和B再次开始。 A正在读取B. B提交和C启动已更改的数据。 A死(回滚),导致C也失败并回滚。
B的变化仍在数据库中,因为它们不依赖于A已经改变的东西。
所以从我自己的角度来看,如果事务B依赖于A而A尚未提交,那么B是否会延迟以等待A提交?当A依赖于C而C需要更长时间时,A也会发生同样的情况。
否则我们不能证明可串行化的合理性。这就是为什么有些读取可以进行脏读(未提交的读/幻读),因为可以避免延迟。另外一些允许读取快照和旧版本也可以避免这些情况。