【发布时间】:2016-06-07 18:09:25
【问题描述】:
两阶段提交被描述为“原子提交协议”。我希望这意味着所有客户端都可以在事务提交之前或提交之后看到世界的状态——没有中间状态。虽然它似乎可以进入事务部分提交并且客户端看到不一致的数据,从而破坏原子性的状态。
考虑两个数据库 A 和 B 的情况。如果在 A 已提交但 B 已提交之前的提交阶段存在分区,则事务是部分提交的。查询 A 和 B 的用户将不会看到一致的数据 - 事务已在 A 上提交,但 B 有提交之前的数据。
ACID 的“一致”部分似乎也被破坏了——查询 A 和 B 的客户端可能会看到违反业务规则的数据。
我猜这个想法是,当分区结束并且事务管理器指示 B 提交时,系统最终能够从中恢复。但与此同时,系统处于不一致的“部分提交”状态。原子性的全部目的不是防止这种情况发生吗?当一致性恢复时,损坏可能已经造成。
当说两阶段提交是原子的时,指的是什么属性?
【问题讨论】:
-
我认为这是隔离级别的问题。在可重复读取下方,您可以看到提交事务之前的一些数据,以及提交事务之后的一些数据。只要没有脏读,它仍然被认为是 ACID(即使使用非分布式数据库也可能发生这种情况)。通常不需要隔离级别 Serializable。
-
另一个问题的答案是“2PC 真的只承诺一个操作是原子的”。我的问题是为什么它看起来不是原子的时被认为是原子的。 2pc 提供的“原子性”是什么?
-
答案还说“2PC 不能适应所有故障场景”,并且会破坏四种 ACID 中的每一种。例如,如果您在中间关闭 B,它可能尚未提交(而 A 已提交),并且将在恢复期间回滚,因此您最终会出现不一致的状态。但除此之外,它是“原子的”:整个事务将被提交,或者一个都不提交。结果如何对其他事务可见是一个隔离问题。
标签: transactions distributed-transactions atomic acid