Objawy
Użycie transakcji XA, sterownik JDBC Microsoft SQL Server i Microsoft SQL Server jako bazy danych zaplecza, możesz mogą mieć oddzielone transakcje oczekujące na serwerze SQL Server Jeśli Menedżer transakcji ulegnie awarii lub problem z łącznością.
Ponadto może wystąpić jeden z następujących symptomów wspólne:-
Transakcje są w toku przez długi czas w wystąpieniu programu SQL Server. W bazie danych mogą mieć wartość null lub jest -2 identyfikator sesji.
-
Transakcje są zablokowane przez długi czas przez transakcję, która ma identyfikator sesji -2 . Powoduje to, że limit czasu blokady lub wątków do zamrożenia.
Przyczyna
Jeśli połączenie między Menedżera transakcji i SQL Server zostaną utracone nieprzygotowany transakcji, następnie sterownik JDBC dla programu SQL Server nie oczyszczania tych transakcji, i mogą nadal korzystać z zasobów i zablokować inne transakcje. Ze względu na wykonanie XA w sterowniku JDBC dla programu SQL Server program SQL Server nie może wykryć nieprawidłowe rozłączenia menedżerów transakcji. W związku z tym dla programu SQL Server, transakcje te pozostają w systemie dopóki nie upłynie limit czasu transakcji XA lub ponownym uruchomieniu bazy danych. Limit czasu używa nieskończoności na wystąpienie programu SQL Server, a nie jest konfigurowany w bazie danych.
Obejście problemu
Aby rozwiązać ten problem, użyj jednej z następujących metod:
-
Uruchom ponownie serwer bazy danych, gdy łączność sieciowa problemy tego wyniku w tych osieroconych transakcji lub w przypadku wszelkich awarii Java Virtual Machine (JVM).
-
Zatrzymaj indywidualnie osieroconych transakcji bazy danych, aby oczyścić swoje zasoby. Aby sprawdzić, czy transakcja jest oddzielony, upewnij się, że nie jest w stanie wątpliwości (przygotowany) transakcji lub taki, który jest obecnie ukończeniu. Wszelkie transakcje, które trwają przez ponowne uruchomienie związanej z tym JVM i cyklu pomyślnego wykonania odzyskiwania powinien oddzielony.
-
Ustaw wartość limitu czasu transakcji XA jest dłuższa niż długie transakcji wymusić przerwanie tak szybko, jak tylko zostanie przekroczona wartość limitu czasu. Można to zrobić przez wywołanie metody XAResource.setTransactionTimeout() .
-
Dla wielu menedżerów transakcji innych firm obiektu XAResource nie jest bezpośrednio dostępna przez kod wywołujący i Menedżer transakcji nie ustawia wartość limitu czasu transakcji. W tej sytuacji zewnętrznej aplikacji może służyć do ustawienia limitu czasu transakcji na nową wartość domyślną. To nowe ustawienie domyślne będą używane przez wszystkie transakcje, które nie określają limit czasu transakcji.