10

最近我多次读到两阶段提交是不好的,但总是作为旁注。所以从来没有一个很好的解释。

例如在CQRS Journey 第 5 章中:

其次,我们试图避免两阶段提交,因为从长远来看它们总是会导致问题。

或者在第 563 页的实现领域驱动设计中:

基础设施使用第二个 ReadRecorts() 来复制事件,在不需要两阶段提交的情况下发布它们,...

我认为实现了两阶段提交以确保多个数据库服务器之间的一致性。

使用两阶段提交时会出现什么问题?为什么最好避免它们?

4

1 回答 1

11

由于两阶段提交协议的阻塞特性,最大的问题是可扩展性。

2PC 需要参与方之间的仔细协调:特别是,每一方都必须确认准备阶段和提交。一旦一方确认它已准备好提交,它必须阻塞直到事务协调器发送提交或回滚消息。如果任何一方在网络上,网络延迟会导致节点之间的通信出现瓶颈。

此外,一旦一方承认它已准备好提交,它实际上必须能够在之后提交事务,即使它在其间崩溃。这需要对持久性存储设置检查点(即使事务随后回滚),也可能会限制吞吐量。

于 2015-10-02T18:35:40.313 回答