接続プールが適用されている間は開いたままにすることができます。例:クライアントが「中止」として送信するため、コマンドタイムアウトによってロックとTXNが残る可能性があります。
2つの解決策:
-
文字通り、クライアントでテストします:
IF @@TRANCOUNT <> 0 ROLLBACK TRAN
-
SET XACT_ABORT ON
を使用します TXNが確実にクリーンアップされるようにするには:質問1と質問2
私はいつもSET XACT_ABORT ON
を使用します 。
このSQLチームのブログから:
接続プーリングでは、ロールバックなしで接続を閉じるだけで接続がプールに戻され、トランザクションは後で再利用されるかプールから削除されるまで開いたままになります。これにより、ロックが不要に保持され始め、他のタイムアウトとローリングブロックが発生する可能性があります
MSDNのセクション「トランザクションサポート」(太字)
接続が閉じられると、接続は解放されてプールに戻され、トランザクションコンテキストに基づいて適切なサブディビジョンに戻されます。したがって、分散トランザクションがまだ保留中であっても、エラーを生成せずに接続を閉じることができます。これにより、後で分散トランザクションをコミットまたは中止することができます。