Sintomas
Quando você usa transações XA, Driver JDBC do Microsoft SQL Server e Microsoft SQL Server como banco de dados back-end, você pode ter órfãos transações pendentes sobre o SQL Server se o Gerenciador de transações sofrer uma falha ou um problema de conectividade.
Além disso, você pode enfrentar um dos seguintes sintomas comuns:
-
As transações estão pendentes por muito tempo na instância do SQL Server. Eles podem ter um Nulo ou -2 identificação da sessão no banco de dados.
-
As transações são bloqueadas por um longo tempo por uma transação que tenha uma identificação de sessão -2 . Isso faz com que um tempo limite de bloqueio ou segmentos para congelar.
Causa
Se a conexão entre o Gerenciador de transações e o SQL Server é perdida para uma transação não preparada, o Driver JDBC do SQL Server não limpar essas transações, e eles podem continuar a usar os recursos e bloquear outras transações. Devido à implementação XA no Driver JDBC para SQL Server, SQL Server não pode detectar desconexões anormais de gerenciadores de transações. Portanto, para SQL Server, essas transações permanecem no sistema até que a transação XA expire ou o banco de dados for reiniciado. O tempo limite usa infinito na instância do SQL Server e não é configurável no banco de dados.
Solução alternativa
Para resolver esse problema, use um dos seguintes métodos:
-
Reinicie o servidor de banco de dados quando você perceber qualquer falha de máquina Virtual Java (JVM) ou problemas de conectividade de rede que resultam nessas transações órfãos.
-
Pare individualmente as transações órfãos no banco de dados para limpar os seus recursos. Para verificar que uma transação é órfão, certifique-se de que não é uma em dúvida (preparada) transação ou que no momento está sendo concluída. Todas as transações que duram por meio de uma reinicialização do relacionados JVM e um ciclo de recuperação bem-sucedida devem ser órfãos.
-
Defina um valor de tempo limite para as transações XA for maior do que a transação mais longa para forçá-los a parar, assim como o valor de tempo limite é excedido. Você pode fazer isso chamando o método XAResource.setTransactionTimeout() .
-
Para muitos gerentes de transação de terceiros, o objeto XAResource não é acessado diretamente pelo código de chamada e o Gerenciador de transações não define o valor de tempo limite da transação. Nessa situação, um aplicativo externo pode ser usado para definir o tempo limite da transação como um novo valor padrão. Esse novo padrão será usada por todas as outras transações que não especificam um tempo limite da transação.