すぐにロールバックされますか? 一定期間後にロールバックされますか? コミットされていない状態になっていますか?接続が閉じられているときにコミットされていないトランザクションはどうなりますか?
接続プーリングを使用して接続を単純にリセットした場合の動作は同じですか?
すぐにロールバックされますか? 一定期間後にロールバックされますか? コミットされていない状態になっていますか?接続が閉じられているときにコミットされていないトランザクションはどうなりますか?
接続プーリングを使用して接続を単純にリセットした場合の動作は同じですか?
接続プーリングが適用されている間は開いたままにできます。例:コマンドのタイムアウトは、クライアントが「abort」として送信するため、ロックとTXNを残す可能性があります。
2ソリューション:
文字通りクライアントでのテスト、:
IF @@TRANCOUNT <> 0 ROLLBACK TRAN
使用SET XACT_ABORT ON
TXNを確保するためには、クリーンアップされます:Question 1とQuestion 2
私はいつもSET XACT_ABORT ON
を使用します。 this SQL Team blogから
:
接続プールで、 は単に ロールバックせずに接続を閉じることだけ が後で再利用または削除されるまでプールや 取引へ の接続が開いたままになります返されることに注意してくださいプールから。 これは、ロックにつながることができます(私の太字) 不要な開催とMSDNから他のタイムアウト とローリングブロック
を引き起こし、セクション「トランザクションサポート」を開始
接続が閉じているとき、それはあります がプールに戻され、 トランザクション・コンテキストに基づく適切な細分化が にあります。したがって、 分散トランザクションが依然として の保留中であっても、 がエラーを生成することなく接続を閉じることができます。これにより、後で に分散トランザクションをコミットするか を中止することができます。
セッションがクローズされると、サーバはコミットされていないトランザクションを即時にロールバックします。
ADOプールは、トランザクションをプールに返す前に、コミットされていないトランザクションをクリアする責任があります。保留中のトランザクションとの接続を廃棄すると、ロールバックされます。
トランザクションは、ADO API(SqlConnection.BeginTransaction)を使用して、またはBEGIN TRANSACTIONステートメントを実行して、クライアントによって開始できます。クライアントとサーバー間のTDSプロトコルには、トランザクションが開始/コミットされたときにクライアントに通知する特別なトークンがあります。そのため、T-SQLコードで開始されていても接続に保留中のトランザクションがあることがわかります。
関連:http://stackoverflow.com/q/4978372/1569 –