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

时间:2015-10-02 13:38:36

标签: database transactions commit cqrs 2phase-commit

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

例如CQRS Journey Chapter 5

  

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

或第563页的Implementing Domain-Driven Design

  

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

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

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

1 个答案:

答案 0 :(得分:10)

最大的问题是由于2阶段提交协议的阻塞性而导致的可扩展性。

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

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