当存储过程中的任何插入语句失败时回滚整个txn

问题描述:

我有一个存储过程,其中有两个不同的表的两个插入语句。当存储过程中的任何插入语句失败时回滚整个txn

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时发生错误,我该如何回滚我的整个事务。我的意思是回滚第一次插入语句。

+0

我认为这个问题是你在找什么:http://dba.stackexchange.com/questions/31279/transaction-and-try-catch-in-sql-server-job –

我的变化是大写:

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. COMMIT在try块的结束BEGIN TRANSACTION
  3. ROLLBACK一切都在追赶块

我的“标准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 
+0

感谢您的回复! ! – user4221591