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

Dom*_*see 9 database transactions commit 2phase-commit cqrs

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

例如在CQRS之旅第5章:

其次,我们试图避免两阶段提交,因为它们总是会导致长期问题.

或者在实施域驱动设计(第563页)中:

第二个ReadRecorts()被基础结构用于复制事件,发布它们而不需要两阶段提交,...

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

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

Ale*_*ger 10

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

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

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