1

この質問は、SQL Server 2000 での TransactionScope と xact_abort の間の相互作用に関連するセマンティクスを調査する試みです。

次の SQL が TransactionScope 内で実行され、最初の削除コマンドがエラーになった場合、2 番目の削除コマンドが実行されますか? (失敗を確実にするために、親から子への外部キーを想定します。)

create procedure test
    @id int
as
set xact_abort on
-- no explicit transaction is created

-- if this fails
delete from dbo.[parentTable]
where id = @id

-- will this run?
delete from dbo.[childTable]
where id = @id

以下のような単純なアプリケーション コードを想定します。

public bool TryTestStoredProcedure()
{
    try 
    {
        using (TransactionScope t = new TransactionScope())
        {
            MethodThatRunsTestStoredProcedure();
            t.Complete();
            return true;
        }
    }
    catch
    {
        return false;
    }
}

ストアド プロシージャの最初の削除ステートメントが失敗した場合、このメソッドからの戻り値は何になりますか? 2 番目の delete ステートメントが失敗した場合はどうなりますか?

4

1 に答える 1

1

上記の私自身の疑似テストコードに基づいていくつかのテストを行った後、XACTABORT を使用する場合と TransactionScope 内で使用しない場合の唯一の違いは、proc が XACTABORT を使用する場合、(XACTABORT がキャッチするエラーの場合) よりも早く失敗することです。 proc は XACTABORT を使用しません。TransactionScope は、例外が発生した後に他の操作が発生した場合でも、そのスコープ内で実行中の任意の時点で発生した例外をキャッチするように見えます。

XACTABORT がオンのストアド プロシージャでは、最初のエラーの後に変更は見られず、XACTABORT がオフの場合、2 番目のステートメントからの変更が見られました。ただし、どちらの場合も、TransactionScope は完了せず、例外をスローしました。

したがって、私の質問に対する簡単な回答は次のとおりです。

  • XACTABORT がオンの場合、2 番目の削除ステートメントは実行されません。
  • XACTABORT がオフの場合、2 番目の削除ステートメント (および後続のコード) が実行されます。
  • ストアド プロシージャの実行中に例外が発生した場合、メソッドの戻り値は false になります。
于 2009-10-01T19:10:45.613 に答える