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;

我在 C# (.NET 4.5) 中使用SqlCommand.ExecuteNonQuery()Method 调用此过程。所有异常都被捕获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 回答