2015-10-02 7 views
8

Kürzlich habe ich mehrfach gelesen, dass zweiphasige Commits schlecht sind, aber immer als Randnotiz. Es gab also nie eine gute Erklärung.Welche Probleme können zweiphasige Commits verursachen?

Zum Beispiel in CQRS Journey Chapter 5:

Zweitens versuchen wir zweiphasige zu vermeiden, verpflichtet, weil sie immer Ursache Probleme auf lange Sicht.

Oder in Implementing Domain-Driven Design auf Seite 563:

Die zweite ReadRecorts() von der Infrastruktur verwendet wird Ereignisse zu replizieren, so dass sie für eine zweiphasige, ohne die Notwendigkeit zu veröffentlichen begehen, ...

Ich dachte, zweiphasige Commits werden implementiert, um die Konsistenz zwischen mehreren Datenbankservern zu gewährleisten.

Welche Probleme können bei der Verwendung von Zweiphasen-Commits auftreten? Warum ist es besser, sie zu vermeiden?

+1

Siehe http://www.enterpriseintegrationpatterns.com/docs/IEEE_Software_Design_2PC.pdf – Matt

Antwort

8

Das größte Problem ist die Skalierbarkeit aufgrund der blockierenden Natur des 2-Phasen-Commit-Protokolls.

2PC erfordert eine sorgfältige Abstimmung zwischen den beteiligten Parteien: Insbesondere muss jede Partei die Vorbereitungsphase und das Commit bestätigen. Sobald eine Partei bestätigt hat, dass sie zum Festschreiben bereit ist, muss sie blockieren, bis der Transaktionskoordinator die Festschreib- oder Rollback-Nachricht sendet. Wenn eine der Parteien über ein Netzwerk ist, verursacht die Netzwerklatenz einen Engpass für die Kommunikation zwischen den Knoten.

Sobald eine Partei bestätigt hat, dass sie bereit ist, zu committen, muss sie die Transaktion tatsächlich auch dann noch ausführen können, wenn sie dazwischen abgestürzt ist. Dies erfordert ein Checkpointing für den Persistenzspeicher (auch wenn die Transaktion später zurückgesetzt wird) und möglicherweise auch den Durchsatz.