我遇到了一种情况,我开始怀疑两阶段提交协议是否真的保证了 ACID 属性,尤其是它的“A”部分。
让我们看一个涉及 2 个资源的理论分布式事务。(关于我必须处理的问题的更实际描述可以在我的博客中找到)。该场景是分布式事务的正常执行(无故障或恢复)。应用程序启动事务,更新资源并发出 commit() 调用。提交完成后,应用程序检查两个资源并查看已完成事务的所有更改。一切都很好,2PC 协议完成了它的工作,对吧?
现在,对场景进行一个小改动。当分布式事务执行 commit() 时,另一个应用程序将访问相同的 2 个资源。它只能看到交易的部分变化吗?比方说,对一个资源的更改已经可见,而对第二个资源的更改尚不可见?
在我阅读的有关 2PC 协议的所有信息中,我找不到任何关于各个资源相对于彼此的变化的可见性的保证。而且我找不到任何说所有资源都在完全相同的时间完成它们的个人提交的东西。