2

SQL Server 2008r2 には、次のようなストアド プロシージャがあります。

create procedure x(@arg1 as nvarchar(20), @arg2 ... )
as
begin
  -- delete and insert values, depending on arguments
   begin transaction;
   delete from tblA where f1 = @arg1 ... ; 
   insert into tblB (a) select ... where f2 = @arg2 ... ; 
   commit transaction;
end;

SqlCommand.ExecuteNonQuery()メソッドを使用して、C# (.NET 4.5) でこの手順を呼び出します。すべての例外はキャッチされますtry--- catch

現在、このメソッドのドキュメントには、「ロールバックが発生した場合、戻り値は -1 です」と記載されています。

質問: 例外を取得せずにロールバックが発生する可能性はありますか?

これまでのところ、SQL ステートメントを実行できなかった場合は常に例外が発生しました。しかし、例外をスローせずにロールバックが「自動的に」発生する場合はありますか?

4

1 に答える 1

1

gbn の回答、 TRY CATCH ROLLBACK パターンを含むトランザクション テンプレート のネストされたストアド プロシージャをご覧ください。

ご質問に基づいて、ロールバックが発生したときに -1 を返すように手順を変更しました。

CREATE PROCEDURE [Name]
    @arg1 as nvarchar(20), 
    @arg2 as nvarchar(20)
AS
    SET XACT_ABORT, NOCOUNT ON

    DECLARE @starttrancount int

    BEGIN TRY
        SELECT @starttrancount = @@TRANCOUNT

        IF @starttrancount = 0
            BEGIN TRANSACTION

         delete from tblA where f1 = @arg1 ... ; 
         insert into tblB (a) select ... where f2 = @arg2 ... ; 

        IF @starttrancount = 0 
            COMMIT TRANSACTION
    END TRY
    BEGIN CATCH
        IF XACT_STATE() <> 0 AND @starttrancount = 0 
        BEGIN
           ROLLBACK TRANSACTION
           RETURN -1
        END  
    END CATCH
    GO
于 2013-10-08T08:42:26.843 に答える