Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What problems can two-phase commits cause?

Recently I've read multiple times that two-phase commits are bad, but always as a side note. So there was never a good explanation with it.

For example in CQRS Journey Chapter 5:

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

Or in Implementing Domain-Driven Design on page 563:

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

I thought two-phase commits are implemented to ensure consistency among multiple database servers.

What problems can occur when using two-phase commits? Why is it better to avoid them?

like image 600
Domysee Avatar asked Oct 02 '15 13:10

Domysee


1 Answers

The biggest problem is scalability due to the blocking nature of the 2 phase commit protocol.

2PC requires a careful coordination between the participating parties: In particular, each party has to acknowledge the prepare phase and the commit. Once a party has acknowledged that it is ready to commit, it has to block until the transaction coordinator sends the commit or rollback message. If either of the parties is over a network, the network latency causes a bottleneck for the communication between the nodes.

Furthermore, once a party has acknowledged that it is ready to commit, it must actually be able to commit the transaction afterwards even if it crashed inbetween. This requires checkpointing to persistence storage (even when the transaction is rolled back afterwards) and also possibly limits the throughput.

like image 158
Alexander Langer Avatar answered Oct 11 '22 06:10

Alexander Langer