例) デッドロックが発生した場合、以下の SQL コマンドは、ロールバック後の SQL トランザクションを割り当てた場合でも、正常に実行されます。SQL Server で作成された新しい暗黙のトランザクションが原因のようです。
コマンドがゾンビ トランザクションで実行されているという例外を ADO.NET がスローすると予想する人もいるでしょう。ただし、そのような例外はスローされません。(これは ASP.NET のバグだと思います。) さらに、ゾンビ トランザクションが原因で、ファイナルDispose()
は黙ってロールバックを無視します。
暗黙のトランザクションで誰もコマンドを実行できないようにするにはどうすればよいですか? または、トランザクションがゾンビであることを確認する方法は? 私はそれを見つけてゾンビトランザクションCommit()
をRollback()
チェックしましたが、テストのためにそれらを呼び出すことができます:)
また、IsolationLevel を読み取るとチェックが行われることもわかりましたが、単純な呼び出しtransaction.IsolationLevel.ToString();
が将来のオプティマイザーによって削除されないかどうかはわかりません。または、ゲッターを呼び出す他の安全な方法を知っていますか (リフレクションや IL の放出を使用せずに)。
編集: Remus Rusanu は、このような状況は通常発生しないと指摘しました。はい、本当です。通常、コードにバグがある場合に発生します。私たちの場合、データベースに失敗を保存しようとしていた最終ステートメントに、いくつかのロギング ルーチンがありました。現在、将来このようなバグを検出する方法を見つけようとしています。これらのバグはテストが難しいためです。提供されたトランザクションがゾンビであることを ADO.NET がチェックする場合、このバグははるかに簡単に発見されます。私は2つの可能性を見つけました:
- 暗黙的なトランザクションの作成をオフにします - これが可能かどうかはわかりません。
- コマンドを実行する前に、ゾンビ トランザクションが実行されるかどうかを確認してください。