ACID如何是两阶段提交协议?

use*_*826 13 transactions distributed-transactions

我遇到了一种情况,我开始怀疑两阶段提交协议是否真的保证了ACID属性,特别是它的"A"部分.

让我们看一下涉及2个资源的理论分布式事务.(更多关于我必须处理的问题的实际描述可以在我的博客中找到).该场景是分布式事务的正常执行(无故障或恢复).应用程序启动事务,更新两个资源并发出commit()调用.提交完成后,应用程序将检查两个资源并查看已完成事务的所有更改.一切都很好,2PC协议完成了它的工作,对吧?

现在,对场景进行了一些小改动.当分布式事务正在执行commit()时,另一个应用程序将使用相同的2个资源.它只能看到交易的部分变化吗?假设,对第二个资源的更改尚未可见时,对一个资源的更改已经可见?

在我阅读过2PC协议的所有信息中,我找不到任何关于各个资源相对于彼此的变化可见性的保证.我找不到任何说明所有资源在同一时间完成各自提交的内容.

Cla*_*ris 6

我认为你是混乱的话题.2PC确保事务提交具有一定的可见性.即在您的事务中,您提交的数据将以特定方式进行排序,并提交该事务将按顺序提交.

在事务之外,您看到的行为将取决于锁定在数据库中的工作方式.通常,您会期望只读查询可以看到事务前状态或事务后事务状态(除非它使用相同的锁定语义,否则不会保证它接收到哪个状态).写语义通常会导致锁定事务中的所有项,但这又取决于数据库的配置方式.

2PC实际上只承诺一个操作是Atomic,即使这样,它只是在该事务范围内必然是原子的,这取决于数据库的配置方式.


tva*_*son 5

我认为您将 2PC 与并发控制混淆了。两阶段提交可确保事务中的所有参与线程要么提交,要么中止。并发控制确保相同或单独应用程序中事务的某种排序。根据您的要求,有多种处理此问题的方法,但完全序列化的事务当然是可能的。