分布式事务:在依赖其他事务的情况下,提交何时真正完成?

时间:2015-07-19 13:25:09

标签: transactions distributed-transactions

我知道我在交易中的公平份额以及它周围的毛病(在我大学期间专注于它)但我从来没有把这个交易:

我有一组由两个进程(节点)创建的(分布式)事务。

及时看起来像这样:

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也会发生同样的情况。

否则我们不能证明可串行化的合理性。这就是为什么有些读取可以进行脏读(未提交的读/幻读),因为可以避免延迟。另外一些允许读取快照和旧版本也可以避免这些情况。

0 个答案:

没有答案