3

BEGIN TRANS - COMMIT TRANS が 1 つの SP で実行され、複数の SP が TransactionScope で実行され、スコープを完了する前にエラーがスローされるとどうなりますか。

したがって、擬似コードは次のとおりです

//Using TransactionScope() {
//   executing SP1 
//   executing SP2
//   executing SP3
//   throw new Exception();
//}

SP2 には、次のコードが含まれています。

// BEGIN TRANS
//   Update Statement1
//   Update Statement2
//   Update Statement3
// COMMIT TRANS

SP2 でトランザクションがコミットされると仮定するとどうなるでしょうか。

  1. すべてがロールバックされる
  2. SP2 の 3 つのステートメントがコミットされます。他のすべてはロールバックされますか?

問題があるかどうかはわかりませんが、念のため、3 つの SP すべてが 1 つの接続オブジェクトを使用して実行され、2 つの ExecuteNonQuery ステートメントの間で接続が閉じられ、再び開かれます。

4

1 に答える 1

2

常に、最も外側のトランザクション スコープによって開始された最も外側のトランザクションが 1 つだけ存在します。他のすべての内部トランザクション スコープと、最も外側のトランザクション スコープの下で発生する T-SQL コード内の他のすべての BEGIN TRANSACTION は、美化されたインクリメントに@@TRANCOUNT他ならず、それらの COMMITS はすべて、同じもののデクリメントにすぎません。重要なのは最後の COMMIT だけであり、それまではトランザクションはコミットされていません。

したがって、あなたの例では、SP2 は何もコミットしませんでした。@@TRANCOUNT を 2 にインクリメントしてから、デクリメントして 1 に戻しました。トランザクションはまだアクティブであり、C# コードがスローされると、トランザクションはロールバックされます。

補足として、適切な例外セーフ ストアド プロシージャを作成する方法のテンプレートについては、例外処理とネストされたトランザクションを参照してください。

于 2012-05-30T13:07:18.570 に答える