現象
XA トランザクション、Microsoft SQL Server の JDBC ドライバー、および Microsoft SQL Server をバックエンド データベースとして使用する場合する可能性がありますが孤立した SQL Server の保留中のトランザクション、トランザクション マネージャーには、クラッシュや接続の問題が発生した場合。
さらに、次の一般的な現象のいずれかが発生する可能性があります。
-
トランザクションが保留中の SQL Server インスタンス上に長い時間です。データベース内で、 nullまたは-2のセッション ID があります。
-
-2セッション ID を持つトランザクションを長時間トランザクションがブロックされています。これが原因でロックのタイムアウトまたはスレッドを固定します。
原因
トランザクション マネージャーと SQL Server 間の接続は、未完のトランザクションは失われる場合、SQL Server の JDBC ドライバーをクリーンアップしません、これらのトランザクションと、常にリソースを使用して、他のトランザクションをブロックすることがあります。SQL Server の JDBC ドライバーで XA 実装、ため SQL Server はトランザクション マネージャーの異常な接続の切断を検出できません。したがっての SQL Server では、これらのトランザクションを維持システムでは、XA トランザクションがタイムアウトか、データベースを再起動するまで。タイムアウトは無限大を使用して、SQL Server のインスタンスに、データベースで構成可能ではありません。
回避策
この問題を解決するには、次の方法のいずれかの手順に従います。
-
Java 仮想マシン (JVM) クラッシュが発生するか、ネットワーク接続がこれらの孤立したトランザクションでは、その結果を発行するときは、データベース ・ サーバを再起動します。
-
そのリソースをクリーンアップするのにはデータベースに孤立したトランザクションを個別に停止します。トランザクションが孤立したことを確認して、間違いではないことを確認するには、(準備) トランザクションまたはそのいずれかの現在の完了です。JVM および正常な回復のサイクルに、関連する複数の再起動を最後のトランザクションが孤立する必要があります。
-
最長のトランザクション タイムアウト値を超えるとすぐに停止することを強制するよりも長い、XA トランザクションのタイムアウト値を設定します。XAResource.setTransactionTimeout()メソッドを呼び出すことによってこれを行うことができます。
-
多くのサード パーティ トランザクション マネージャーのXAResourceオブジェクトが呼び出し元のコードによって直接アクセスがないと、トランザクション マネージャーがトランザクションのタイムアウト値を設定していません。この状況では、新しい既定値をトランザクションのタイムアウトを設定するのには外部アプリケーションを使用できます。この新しい既定値は、トランザクションのタイムアウトが指定されていないその他のすべてのトランザクションで使用されます。