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

Transactions 为什么两阶段提交被认为是原子的?,transactions,atomic,distributed-transactions,atomicity,acid,Transactions,Atomic,Distributed Transactions,Atomicity,Acid,两阶段提交被描述为“原子提交协议”。我希望这意味着,所有客户机都可以在事务提交之前或提交之后看到世界的状态,而不需要中间状态。似乎它可以进入一种状态,即事务部分提交,客户端看到不一致的数据,从而破坏原子性 考虑两个数据库A和B的情况。如果在A提交之后但B提交之前的提交阶段存在分区,则事务部分提交。查询A和B的用户将看不到一致的数据——事务已在A上提交,但B具有提交之前的数据 ACID的“一致性”部分似乎也被破坏了——查询a和B的客户机可能会看到违反业务规则的数据 我猜这个想法是,当分区结束,事务

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

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

ACID的“一致性”部分似乎也被破坏了——查询a和B的客户机可能会看到违反业务规则的数据

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


当两阶段提交被称为原子提交时,所指的属性是什么?

原子表示操作将产生某种效果,或者系统将保持在相同的状态。2PC算法的工作原理是,首先协调器要求所有分布式机器为事务做
准备。在收到一个
Yes
后,它发送一个提交事务的命令

如果协调器仅从所有机器收到成功消息,则事务完成;否则,如果在此之后出现网络中断或任何其他问题,则您将陷入两个将军的问题。它的原子结构和分布式系统一样多


一致性只能通过隔离级别来实现。是否允许读取以及是否允许脏读取。

我没有这方面的学术背景,但根据我的实际经验(我是Narayana项目的QE),2PC不表示为ACID。它只确保事务是原子的。原子的,所有的东西或什么都没有完成

我认为你在你的问题中很好地提出了2便士的限制

由于事务分布在更多的DBs/JMS代理上/。。。无法保证它们会相互隔离。如上所述,事务管理器只管理资源,并说明何时准备(锁定)和何时提交。例如,如果事务管理器和第二个资源之间的连接在提交阶段被关闭,而第一个资源已经提交,那么您可以在第一个资源中看到已经提交的数据,但第二个等待提交的数据将在连接建立后被处理。但你可以确保它最终会被执行。在特定资源级别(可以)确保隔离(使用第二个资源上的数据的所有事务都将被隔离)

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


正如ACID()所述,通常情况下,即使是DB事务也会默认地放松隔离ACID属性。大多数DBs使用默认的隔离级别READ COMMITTED,它可以保护您所有的问题(不可重复的读取和幻象读取可能会发生,具体取决于DB实现)。

我认为这是隔离级别的问题。在Repeatable Read下面,您可以看到事务提交前的一些数据,以及事务提交后的一些数据。只要没有脏读,这仍然被认为是ACID(即使在非分布式数据库中也可能发生)。通常不需要隔离级别的可序列化。对另一个问题的回答是“2PC实际上只承诺操作是原子的”。我的问题是,为什么它看起来不是原子的,却被认为是原子的。2pc提供的“原子性”是什么?答案还说“2pc对所有故障场景都没有弹性”,这使得四种ACID中的每一种都失效。例如,如果您在中间关闭B,它可能还没有提交(而A已经),并且在恢复过程中会回滚,因此最终会出现一个不一致的状态。但除此之外,它是“原子的”:整个事务将被提交,或者根本没有提交。结果如何对其他事务可见是一个孤立的问题。我无意中又回到了这个问题。我想在这里加强我的回应。问题是,这个问题混合了酸的一致性和上限的一致性的概念。原子性定义事务全部提交或全部中止。在事务执行期间没有其他关于部分结果的内容。一致性表示:“在事务完成时,数据库在结构上是可靠的”。我要指出“在完成时”。模棱两可的是CAP的一致性说:“所有节点看到的所有读写执行都是原子的”。