web-dev-qa-db-ja.com

接続が閉じられると、コミットされていないトランザクションはどうなりますか?

それらはすぐにロールバックされますか?一定期間後にロールバックされますか?コミットされていない状態のままになっていますか?

接続プールが使用され、接続が単にリセットされた場合の動作は同じですか?

43
JohnnyM

接続プールが適用されている間、開いたままにすることができます。例:クライアントが「アボート」として送信するため、コマンドタイムアウトはロックとTXNを残す可能性があります。

2つのソリューション:

  • 文字通り、クライアントでテストします。

    IF @@TRANCOUNT <> 0 ROLLBACK TRAN

  • 使用する SET XACT_ABORT ON TXNが確実にクリーンアップされるようにします: 質問1 および 質問2

私はいつもSET XACT_ABORT ON

このSQLチームのブログ から:

接続プールでは、ロールバックせずに接続を閉じるだけでプールへの接続が返され、トランザクションは後で再利用されるかプールから削除されるまで開いたままになることに注意してください。これにより、ロックが不要に保持され始め、他のタイムアウトやローリングブロックが発生する可能性があります

[〜#〜] msdn [〜#〜] から、「トランザクションサポート」セクション(太字)

接続が閉じられると、そのトランザクションコンテキストに基づいて、プールと適切なサブディビジョンに解放されます。したがって、分散トランザクションがまだ保留中である場合でも、エラーを生成せずに接続を閉じることができます。これにより、後で分散トランザクションをコミットまたは中止できます。

25
gbn

コミットされていない変更は接続の外からは見えないため、ロールバックの時間は関係ありません。つまり、トランザクションは最終的にロールバックされます。

9
Fozi

セッションが閉じられると、サーバーはコミットされていないトランザクションを即座にロールバックします。
ADOプールは、トランザクションをプールに戻す前に、コミットされていないトランザクションをクリアする責任があります。保留中のトランザクションとの接続を破棄すると、ロールバックされます。

トランザクションは、ADO API(SqlConnection.BeginTransaction)を使用して、またはBEGIN TRANSACTIONステートメントを実行することによって、クライアントによって開始できます。クライアントとサーバー間のTDSプロトコルには、トランザクションが発生したときにクライアントに通知する特別なトークンがありますこのように開始/コミットされたため、ADOは、T-SQLコードで開始された場合でも、接続に保留中のトランザクションがあることを認識しています。

6
Remus Rusanu