Problembeschreibung
Wenn Sie XA-Transaktionen, JDBC-Treiber für Microsoft SQL Server und Microsoft SQL Server als Back-End-Datenbank verwenden, haben Sie möglicherweise Transaktionen bis auf SQL Server verwaist, wenn der Transaktions-Manager einen Absturz oder ein Konnektivitätsproblem.
Darüber hinaus können Sie eines der folgenden Symptome auftreten:-
Transaktionen sind ausstehende lange auf der Instanz von SQL Server. Sie haben eine null oder -2 Session-ID in der Datenbank.
-
Transaktionen sind lange eine Transaktion blockiert, die eine -2 Sitzung-ID verfügt. Dadurch wird ein Timeout oder Threads einfrieren.
Ursache
Wenn die Verbindung zwischen dem Transaktions-Manager und SQL Server für eine Transaktion aufgehoben JDBC-Treiber für SQL Server wird nicht bereinigt diese Transaktionen und sie weiterhin Ressourcen und andere Transaktionen blockieren. Da der XA-Implementierung in den JDBC-Treiber für SQL Server erkannt nicht SQL Server ungewöhnlich Verbindungsabbrüche Transaktions-Manager. Daher bleiben SQL Server diese Transaktionen im System bis der XA-Transaktion Timeout oder die Datenbank neu gestartet. Das Zeitlimit unendlich auf der Instanz von SQL Server verwendet und kann nicht auf die Datenbank konfiguriert.
PROBLEMUMGEHUNG
Um dieses Problem zu beheben, verwenden Sie eine der folgenden Methoden:
-
Starten Sie Datenbankserver neu, wenn Sie Java Virtual Machine (JVM) Abstürze oder Netzwerkkonnektivität diese verwaisten Transaktionen zur Folge stellt.
-
Beenden Sie einzeln verwaisten Transaktionen in der Datenbank, um Ressourcen zu bereinigen. Überprüfen, ob eine Transaktion verwaist ist, stellen Sie sicher, dass es nicht in Zweifel vorbereitet () Transaktion oder eine gerade abgeschlossen wird. Alle Transaktionen, die durch einen Neustart der JVM und eine erfolgreiche Wiederherstellung Zyklus sollte verwaist.
-
Legen Sie einen Timeoutwert für XA-Transaktionen, die länger als die längste Transaktion zu beenden, sobald das Zeitlimit überschritten. Sie können hierzu XAResource.setTransactionTimeout() aufrufen.
-
Viele Drittanbieter-Transaktions-Manager das XAResource -Objekt nicht direkt durch den aufrufenden Code zugegriffen und der Transaktions-Manager nicht den Transaktionstimeout-Wert festgelegt. In diesem Fall kann eine externe Anwendung verwendet werden, das Transaktionstimeout auf einen neuen Standardwert festgelegt. Diese neue Standardeinstellung wird von anderen Transaktionen verwendet, die keine Transaktionstimeout angeben.