2009-10-08 1 views

答えて

22

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

2ソリューション:

  • 文字通りクライアントでのテスト、:

    IF @@TRANCOUNT <> 0 ROLLBACK TRAN

  • 使用SET XACT_ABORT ON TXNを確保するためには、クリーンアップされます:Question 1Question 2

私はいつもSET XACT_ABORT ONを使用します。 this SQL Team blogから

接続プールで、 は単に ロールバックせずに接続を閉じることだけ が後で再利用または削除されるまでプールや 取引へ の接続が開いたままになります返されることに注意してくださいプールから。 これは、ロックにつながることができます(私の太字) 不要な開催とMSDNから他のタイムアウト とローリングブロック

を引き起こし、セクション「トランザクションサポート」を開始

接続が閉じているとき、それはあります がプールに戻され、 トランザクション・コンテキストに基づく適切な細分化が にあります。したがって、 分散トランザクションが依然として の保留中であっても、 がエラーを生成することなく接続を閉じることができます。これにより、後で に分散トランザクションをコミットするか を中止することができます。

+1

接続プールはクライアント側で行われるため、クライアントが内部的に接続を中断せずに接続を中断した場合、ロールバックを発行するか、この状況を解決するために必要な処理を行う必要があります。 – Fozi

+0

@Fozi:SET XACT_ABORTをONにしない限り。 – gbn

10

コミットされていない変更は接続の外部では表示されないため、ロールバックの時間は無関係です。そう、はい、トランザクションは最終的にロールバックされます。

+9

しかし、それはタイミングがまだ重要なので、あなたの分離に応じて、(コミット/ロールバックを待っている)他の接続を掛けることができます。 –

+2

正解ですが、重点は「悪い」最終的なものです。 – gbn

+0

TCP(または何でも)接続が閉じられているか破損しているとすぐにロールバックされると思います。接続プーリングについては、gbnの答えを参照してください。 – Fozi

6

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

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

関連する問題