Симптомы
При использовании транзакций XA, драйвер JDBC Microsoft SQL Server и Microsoft SQL Server в качестве серверной базы данных вы может изолированы незавершенных транзакций в SQL Server Если диспетчер транзакций обнаруживает сбой или проблемы с подключением.
Кроме того возможно возникновение следующих распространенных проблем:-
Ожидающих транзакций в течение длительного времени на экземпляре SQL Server. Они могут иметь значение null или -2 идентификатора сеанса в базе данных.
-
Операции заблокированы в течение длительного времени транзакцией, которая имеет идентификатор сеанса -2 . В этом случае время ожидания блокировки и потоки для закрепления.
Причина
Если между SQL Server и диспетчер транзакций теряется сетевое подключение для неподготовленных транзакции, то драйвер JDBC для SQL Server не обеспечивает очистки этих операций, и они могут продолжать использовать ресурсы и не дает другим транзакциям. Из-за реализации XA драйвера JDBC для SQL Server SQL Server не удается обнаружить непредвиденного отключения диспетчеров транзакций. Таким образом для SQL Server, эти транзакции остаются в системе до тайм-аут транзакции XA или перезапуска базы данных. Тайм-аут использует бесконечности на экземпляре SQL Server, а не настраивается в базе данных.
Временное решение
Чтобы устранить эту проблему, используйте один из следующих методов:
-
Перезапустите сервер базы данных при возникновении сбоев любой виртуальной машины Java (JVM) или подключения к сети в силу своей эти потерянные транзакции.
-
По отдельности остановите потерянные транзакции в базе данных, чтобы очистить свои ресурсы. Чтобы убедиться, что транзакция считается потерянной, убедитесь в том, что он не в состоянии под сомнением (Подготовка) или тот, который в настоящее время завершения транзакции. Все транзакции, которые последнего до перезапуска связанного JVM и успешное восстановление цикла следует потерянными.
-
Задайте значение времени ожидания транзакций XA, длина которого превышает длинной операции принудительной остановки сразу же превышает значение времени ожидания. Это можно сделать, вызвав метод XAResource.setTransactionTimeout() .
-
Для многих руководителей независимых транзакций объект XAResource не доступно для непосредственно вызывающего кода и диспетчер транзакций не устанавливает значение тайм-аута транзакции. В этом случае можно использовать внешнее приложение присвоено новое значение по умолчанию времени ожидания транзакции. Это новое значение по умолчанию будет использоваться все транзакции, которые не задан тайм-аут транзакции.