Könnte jemand den Unterschied zwischen einphasigem und zweiphasigem Commit klären? Soweit ich verstehe, Ein-Phasen-Commit stellt Commit im Laufe der Anwendung Server (Service-Methode - & gt; EntityManager) und XA Commit ist die gleiche Transaktion bis zur Datenbank (Service-Methode - & gt; EntityManager - & gt; DB) und ist wird verwendet, um die gesamte Transaktion ordnungsgemäß zurückzusetzen. Warum verwenden wir nicht standardmäßig XA-Treiber? Ist das nur Leistungsbedenken? Bitte korrigieren Sie mich, wenn ich falsch liege.
Der Unterschied besteht darin, dass ein einphasiges Commit normalerweise in einem System oder einer Datenbank verwendet wird, während ein zweiphasiges Commit für verteilte Transaktionen verwendet wird, die sich über mehrere DBs oder Systeme erstrecken. Lassen Sie mich Ihnen ein einfaches Beispiel für jedes
zeigenEinphasiges Commit
%Vor%Dies ist eine klassische atomare Transaktion, die in PL / SQL geschrieben ist (für Java EE world, stellen Sie sich die EJB-Methode vor, die auch transaktional sein kann), es gibt nur eine Phase, in der alle Aktionen ausgeführt werden und entweder das Commit oder Rollback durchgeführt wird. p>
Zweiphasiges Commit
%Vor%Nun haben Sie es mit verschiedenen Systemen auf verschiedenen Rechnern zu tun, aber Sie wollen alle erfolgreich schreiben oder scheitern (deshalb ist es eine verteilte Transaktion). So, hier kommt das Zwei-Phasen-Commit-Protokoll . Im Grunde sendet der Broadcast-Manager eine "Prepare for Commit" -Nachricht und wartet dann auf eine OK-Antwort von jeder Maschine. Wenn jeder sagt, dass es "in Ordnung" ist, wird alles festgelegt - wenn nicht, werden alle Transaktionen zurückgesetzt.
Beachten Sie, dass Sie einen JDBC-Treiber mit XA-Unterstützung (und ordnungsgemäß konfigurierter XA-Datenquelle) benötigen, wenn Sie XA-Transaktionen in Java verwenden möchten.