Transactions XA orphelines lorsque vous vous connectez à SQL Server à l’aide du pilote JDBC pour SQL Server

Symptômes

Lorsque vous utilisez des transactions XA, pilote JDBC de Microsoft SQL Server et Microsoft SQL Server en tant que la base de données back-end, vous pouvez orphelins transactions en attente sur le SQL Server si le Gestionnaire de transactions est confronté à un incident ou un problème de connectivité.

En outre, vous pouvez rencontrer l’un des problèmes courants suivants :

  • Les transactions sont en attente pour une longue période sur l’instance de SQL Server. Ils peuvent avoir une valeur null ou -2 ID de session dans la base de données.

  • Les transactions sont bloquées pendant une longue période par une transaction avec un ID de session -2 . Cela entraîne un délai de verrouillage ou de threads à figer.

Cause

Si la connexion entre le Gestionnaire de transactions et de SQL Server est perdue pour une transaction non préparée, puis le pilote JDBC pour SQL Server ne nettoie pas ces opérations, et ils peuvent continuer à utiliser les ressources et de bloquer d’autres transactions. En raison de l’implémentation XA dans le pilote JDBC pour SQL Server, SQL Server ne peut pas détecter les déconnexions anormales de gestionnaires de transactions. Par conséquent, pour SQL Server, ces transactions restent dans le système jusqu'à ce que la transaction XA arrive à expiration ou de redémarrage de la base de données. Le délai d’attente utilise l’infini sur l’instance de SQL Server et n’est pas configurable sur la base de données.

Solution de contournement

Pour résoudre ce problème, appliquez l’une des méthodes suivantes :

  • Redémarrez le serveur de base de données lorsque vous rencontrez des blocages de Java Virtual Machine (JVM) ou la connectivité réseau des problèmes dans ces transactions orphelines.

  • Individuellement, arrêter les transactions orphelines dans la base de données à nettoyer leurs ressources. Pour vérifier qu’une transaction est orphelin, assurez-vous qu’il n’est pas un incertaine (préparé) transaction ou qui est actuellement à la fin. Toutes les transactions qui s’étendent à un redémarrage de la JVM et un cycle de récupération doivent être orphelins.

  • Définir une valeur de délai d’attente pour les transactions XA est plus longue que la transaction la plus longue pour les forcer à arrêter dès que la valeur de délai d’expiration est dépassée. Vous pouvez le faire en appelant la méthode XAResource.setTransactionTimeout() .

  • Pour de nombreux responsables de la transaction de tierce partie, l’objet XAResource n’est pas directement accessible par le code appelant, et le Gestionnaire de transactions ne définit pas la valeur de délai d’expiration de transaction. Dans ce cas, une application externe peut être utilisée pour définir le délai de transaction à une nouvelle valeur par défaut. Cette nouvelle valeur par défaut sera utilisé par toutes les autres transactions qui ne spécifient pas un délai d’expiration de la transaction.

Besoin d’aide ?

Développez vos compétences
Découvrez des formations
Accédez aux nouvelles fonctionnalités en avant-première
Rejoindre Microsoft Insider

Ces informations vous ont-elles été utiles ?

Nous vous remercions pour vos commentaires.

Merci pour vos commentaires. Il serait vraisemblablement utile pour vous de contacter l’un de nos agents du support Office.

×