当任何insert语句在存储过程中失败时,回滚整个txn

时间:2015-07-21 09:21:01

标签: sql sql-server sql-server-2008 stored-procedures

我有一个存储过程,其中有两个不同表的insert语句。

create procedure p_multiple_insert
(
// variable declaration
)
declare @temp int = 0;
begin try
    begin 
    // insert statement for TABLE1
        set @temp = 1;
    if(@temp = 1)
        begin
            // insert statement for TABLE2
        end
    end
end try
begin catch
// insert into error table error_number() & error_message()
end catch

如果第一个插入语句块@temp = 0发生错误。因此第二个插入块不会执行,数据也不会插入TABLE1。

但是如果在插入TABLE2时发生错误,我该如何回滚整个事务。我的意思是回滚第一个插入语句。

1 个答案:

答案 0 :(得分:1)

我的更改是大写的:

create procedure p_multiple_insert
(
-- variable declaration
)
declare @temp int = 0;

BEGIN TRANSACTION

begin try
    -- insert statement for TABLE1
        set @temp = 1;
    if(@temp = 1)
        begin
            -- insert statement for TABLE2
        end
    end

    COMMIT TRANSACTION

end try
begin catch

    ROLLBACK TRANSACTION

    -- insert into error table error_number() & error_message()
end catch
  1. 开始时开始交易
  2. 在try块结束时执行
  3. ROLLBACK catch-block中的所有内容
  4. 我的“Standard-Catch-Block”总是如下所示:

        DECLARE @errmsg NVARCHAR(MAX)
        SELECT  @errmsg = 'Error executing dbo.StoredProcName: ' 
                             + COALESCE(ERROR_MESSAGE(),'No Message from SQL Server')
        RAISERROR(@errmsg,16,1)
        ROLLBACK TRANSACTION