两阶段提交会导致什么问题?

What problems can two-phase commits cause?

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

例如 CQRS Journey Chapter 5:

Second, we're trying to avoid two-phase commits because they always cause problems in the long run.

或在第 563 页的 Implementing Domain-Driven Design 中:

The second ReadRecorts() is used by the infrastructure to replicate events, to publish them without the need for two-phase commit, ...

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

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

由于 2 阶段提交协议的阻塞性质,最大的问题是可伸缩性。

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

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