为什么两阶段提交被认为是原子的?

时间:2016-02-25 05:46:19

标签: transactions atomic distributed-transactions atomicity acid

两阶段提交被描述为“原子承诺协议”。我希望这意味着所有客户端在事务提交之前或提交之后都会看到世界状态 - 没有中间状态。似乎它可以进入一个事务部分提交的状态,客户端看到不一致的数据,打破原子性。

考虑具有两个数据库A和B的情况。如果在A提交之后但在B已提交之前的提交阶段期间存在分区,则事务部分提交。查询A和B的用户将看不到一致的数据 - 事务已在A上提交,但B在提交之前有数据。

ACID的“一致”部分似乎也被打破了 - 查询A和B的客户可能会看到违反业务规则的数据。

我想这个想法是,当分区结束并且事务管理器指示B提交时,系统最终将能够从中恢复。与此同时,系统处于不一致的“部分承诺”状态。是不是要防止这种原子性的全部要点?恢复一致性时,可能已经造成了损害。

当两阶段提交被称为原子时,会引用什么属性?

2 个答案:

答案 0 :(得分:2)

Atomic意味着操作会产生一些影响,或者系统将保持相同的状态。 2PC算法的工作原理是,协调器首先要求所有分布式计算机prepare进行事务处理。收到Yes后,它会在命令中发送提交事务。

如果协调员仅从所有机器获得成功,那么交易就完成了,否则如果在此之后发生网络中断或任何其他问题,那么您将陷入两位将军&#39的问题;问题即可。它的原子和分布式系统一样多。

只有隔离级别才能实现一致性。是否允许读取和允许脏读。

答案 1 :(得分:0)

我没有这方面的学术背景,但根据我的实践经验(我是Narayana项目的量化宽松政策)2PC未被称为ACID。它只确保事务是原子的。无论什么或什么都没有完成的原子。

我认为你在你的问题中已经很好地限制了2PC。

由于事务分布在更多DB / JMS代理/ ...上,因此无法保证这些事务将彼此隔离。如上所述,事务管理器仅管理资源并说明何时准备(锁定)以及何时提交。例如,如果事务管理器和第二个资源之间的连接在第一个资源已提交的提交阶段被放下,则是,您可以在第一个资源上看到已提交的数据,但是在连接建立后将处理第二个等待提交的数据。但是你确保它最终会被提交。隔离(可以)确保在特定资源的级别(所有与第二资源上的数据一起使用的事务将被隔离)。

另一方面,我认为一致性没有被打破。一致性意味着事务根据定义的规则将系统从一个有效状态带到另一个有效状态。系统将在交易开始时和交易结束时保持一致。

当陈述ACID(https://en.wikipedia.org/wiki/ACID)时,通常甚至DB事务默认放松隔离ACID属性。大多数数据库使用默认隔离级别READ COMMITTED,它可以保护您的所有麻烦(不可重复的读取和幻像读取可能会发生,这取决于数据库的实现)。