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

Transactions 分布式事务:在依赖其他事务的情况下,何时真正完成提交?,transactions,distributed-transactions,Transactions,Distributed Transactions,我知道我在交易中所占的份额和它周围的琐事(我在大学期间专门研究过它),但我从来没有做对这一点: 我有一组由两个进程(节点)创建的(分布式)事务 及时地,它看起来是这样的: P1:|--------------------A----------------------| P2:|--------B-------C---------C 现在是有趣的部分: 无干扰场景: A开始,B开始。B更改A从未读取的内容。B提交,C启动,也不干扰A,A提交完成 即使C失败或B失败,A仍然可以提交 B取决于某个场景

我知道我在交易中所占的份额和它周围的琐事(我在大学期间专门研究过它),但我从来没有做对这一点:

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

及时地,它看起来是这样的:

P1:|--------------------A----------------------|
P2:|--------B-------C---------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已提交,因此无法判断A设置的暂停信息是否在B提交后提供给外部。所以我认为B依赖于A,它的提交会被延迟到A已经提交的时间点,因为它是一个读未提交

A取决于B场景

A和B又开始了。A正在读取B更改的数据。B提交,C启动。A冲模(回滚),导致C也失败并回滚

B的更改仍然在数据库中,因为它们不依赖于A已经更改的内容

所以,从我自己的角度来看,如果事务B依赖于A,而A尚未提交,那么B是否会延迟以等待A提交?当A依赖于C并且C需要更长的时间时,A也会发生同样的情况

否则,我们将无法证明序列化的合理性。这就是为什么一些读取可以进行脏读取(未提交读取/幻影读取),以避免延迟。另外,还有一些允许在快照和旧版本上进行读取,以避免出现这些情况