最近我多次读到两阶段提交很糟糕,但总是作为旁注。所以从来没有一个很好的解释。
例如在 CQRS 旅程第 5 章中:
其次,我们试图避免两阶段提交,因为它们总是 从长远来看会造成问题。
或者在第 563 页的实现领域驱动设计:
第二个 ReadRecorts() 被基础设施用来复制 事件,无需两阶段提交即可发布它们,...
我认为实现两阶段提交是为了确保多个数据库服务器之间的一致性。
使用两阶段提交时会出现哪些问题?为什么最好避免它们?
由于两阶段提交协议的阻塞性质,最大的问题是可扩展性。
2PC 需要参与方之间的仔细协调:特别是,每一方都必须承认准备阶段和提交。一旦一方确认已准备好提交,它就必须阻塞,直到事务协调器发送提交或回滚消息。如果任何一方通过网络,网络延迟会导致节点之间的通信出现瓶颈。
此外,一旦一方确认已准备好提交,它实际上必须能够在之后提交事务,即使它在中间崩溃了。这需要对持久性存储进行检查点(即使事务随后回滚),并且还可能限制吞吐量。
有2个站点 第一阶段:
第二阶段: 现在有2个问题1.队列失败2.坐标失败 当坐标失败时,队列站点会等待,直到坐标端从故障中恢复..并且出现称为两阶段提交块问题的问题...(以及更多..)