Symptom
När du använder XA-transaktioner, JDBC-drivrutinen för Microsoft SQL Server och Microsoft SQL Server som backend-databas har du överblivna väntande transaktioner på SQL-servern om transaktionshanteraren uppstår en krasch eller ett anslutningsproblem.
Dessutom händer något av följande vanliga problem:
-
Transaktioner väntar för länge på instansen av SQL Server. De kan ha en null eller -2 sessions-ID i databasen.
-
Transaktioner är spärrade för lång tid av en transaktion som har ett -2 sessions-ID. Detta medför en lås-timeout eller trådar att frysa.
Orsak
Om anslutningen mellan transaktionshanterare och SQL Server bryts för en oförberedd transaktion JDBC-drivrutinen för SQL Server inte rensa upp dessa transaktioner och de kan fortsätta att använda resurser och blockera andra transaktioner. På grund av XA-implementering i JDBC-drivrutinen för SQL Server kan SQL Server identifiera onormala frånkoppling av transaktionshanterare. Därför för SQL Server, dessa transaktioner finns kvar i systemet tills den XA-transaktionen timeout eller databasen startas. Timeout på instansen av SQL Server används oändlighet och kan inte konfigureras på databasen.
Temporär lösning
Lös problemet med någon av följande metoder:
-
Starta om databasservern när det uppstår någon Java Virtual Machine (JVM) kraschar eller nätverksanslutningen problem som uppstår i dessa överblivna transaktioner.
-
Stoppa individuellt överblivna transaktioner på databasen för att rensa upp sina resurser. Kontrollera att det inte är en osäker för att verifiera att en transaktion blir ägarlös beredda () transaktion eller en som för närvarande klar. Alla transaktioner som senast genom en omstart av den relaterade JVM och en lyckas återställa bör vara övergivna.
-
Ange ett timeout-värde för XA-transaktioner som är längre än den längsta transaktionen att tvinga dem att stoppa när tidsgränsen har överskridits. Du kan göra detta genom att anropa metoden XAResource.setTransactionTimeout() .
-
För många tillverkare transaktionshanterare, XAResource -objektet används inte direkt som den anropande koden och transaktionshanteraren Ange inte timeout-värdet för transaktionen. I det här fallet kan ett externt program användas för att ställa in timeout-värdet för transaktionen till ett nytt standardvärde. Denna nya standard kommer att användas av andra transaktioner som inte anger en tidsgräns för transaktionen.