Vor kurzem habe ich mehrfach gelesen, dass zweiphasige Commits schlecht sind, aber immer als Randnotiz. Also gab es nie eine gute Erklärung damit.
Zum Beispiel in CQRS Journey Kapitel 5 :
Zweitens versuchen wir, Zwei-Phasen-Commits zu vermeiden, weil sie immer Probleme auf lange Sicht verursachen.
Oder in Implementieren eines domänengesteuerten Designs auf Seite 563:
Der zweite ReadRecorts () wird von der Infrastruktur zum Replizieren verwendet Ereignisse, um sie ohne die Notwendigkeit für zweiphasiges Festschreiben zu veröffentlichen, ...
Ich dachte, zweiphasige Commits werden implementiert, um die Konsistenz zwischen mehreren Datenbankservern zu gewährleisten.
Welche Probleme können bei der Verwendung von zweiphasigen Commits auftreten? Warum ist es besser, sie zu vermeiden?
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 anerkennen. 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.
Wenn eine Partei einmal bestätigt hat, dass sie bereit ist, sich zu verpflichten, muss sie die Transaktion auch später tatsächlich durchführen können, selbst wenn sie dazwischen stürzte. Dies erfordert ein Checkpointing für den Persistenzspeicher (auch wenn die Transaktion später zurückgesetzt wird) und möglicherweise auch den Durchsatz.
Tags und Links database transactions commit cqrs 2phase-commit