1

申し訳ありませんが、それは言葉にするのが難しい質問でした:

挿入を行うストアド プロシージャがあるとします。すべてがそのトランザクション内でうまくいけば、それはトランザクションにラップされ、コミットされます。

ここで、.net 関数からそのトランザクションを呼び出します。この関数では、同様の方法で構築されたストアド プロシージャも呼び出すいくつかの関数を呼び出す必要があります。例:

bool SaveTicket()
{
   using(MyTransaction)
   {
      try
      {
         SaveTicketInfo(); //calls sproc 1
         SaveComments(); //calls sproc 2
         SaveAttachments(); //calls sproc 3
      }
      catch(Exception)
      {
         MyTransactionRollback(); //i would normally wrap this in its own try/catch
      }
   }
}

これがプロセスの骨子です。コードで実際に行っていることは、3 つのプロセスそれぞれの戻り値をチェックすることです。それらが false を返す場合は、ロールバックをトリガーする例外をスローします。

私が疑問に思っているのは、これらのストアド プロシージャにコミットがある場合、.net 関数でのロールバックは引き続き機能するのでしょうか? それとも全く駄目ですか?

4

2 に答える 2

1

はい、ロールバックされます。

SQL Server のトランザクションは入れ子にすることができます。内部トランザクションは、基本的に SQL Server によって無視されます。内部トランザクションを閉じる唯一の方法は、それをコミットすることです (つまり、外部トランザクションをコミットするには、すべての内部トランザクションをコミットする必要があります)。ロールバック ステートメントは、最も外側のトランザクションにのみ適用されます。

ここで詳細を読むことができます: http://msdn.microsoft.com/en-us/library/ms189336(v=sql.105).aspx

于 2012-07-18T17:06:19.690 に答える
1

そもそも、sproc 内に別個のトランザクションが本当に必要かどうかを最初に尋ねると思います。それらをそこに置くと、アプリ コードの保守が非常に難しくなり、アプリケーション ロジックを永続ストアに配置します。

私の直感によると、sproc は独自のトランザクションを作成してコミットするため、ロールバックされてもそれらはロールバックされませんMyTransactionが、実際の答えは DTC の構成方法に依存する可能性があります。

詳細については、この回答を参照してください

于 2012-07-18T17:07:05.030 に答える