Proper way to use a transaction around multiple inserts or updates

前端 未结 3 594
不知归路
不知归路 2020-12-24 09:42

What is the proper way to test for insert/update failures and rollback this transaction if there are any? I don\'t think what I have will work since my inserts/updates are 3

相关标签:
3条回答
  • 2020-12-24 09:48

    Failing inserts will throw. "Failing" updates can be detected using @@ROWCOUNT.

    0 讨论(0)
  • 2020-12-24 09:52

    I don't know what version you're on, but there has been try/catch since SQL 2005:

    begin transaction
    begin try
       INSERT INTO TableA (id) VALUES (1)
       INSERT INTO TableB (id) VALUES (1)
       UPDATE TableC SET id=1 WHERE id=2
    end try
    begin catch
       SELECT
            ERROR_NUMBER() AS ErrorNumber,
            ERROR_SEVERITY() AS ErrorSeverity,
            ERROR_STATE() AS ErrorState,
            ERROR_PROCEDURE() AS ErrorProcedure,
            ERROR_LINE() AS ErrorLine,
            ERROR_MESSAGE() AS ErrorMessage;
       while(@@trancount > 0)
       begin
          rollback transaction
       end
    end catch
    if (@@trancount <> 0)
    begin
       commit transaction;
    end
    
    0 讨论(0)
  • 2020-12-24 10:12

    If you put SET XACT_ABORT ON before you start transaction, in case of an error, rollback will be issued automatically.

    SET XACT_ABORT ON
    
    begin transaction
    
    INSERT INTO TableA (id) VALUES (1)
    INSERT INTO TableB (id) VALUES (1)
    UPDATE TableC SET id=1 WHERE id=2
    
    commit transaction
    

    If you want to do rollback yourself, use try .. catch block.

    begin transaction
    
    begin try
    
      INSERT INTO TableA (id) VALUES (1)
      INSERT INTO TableB (id) VALUES (1)
      UPDATE TableC SET id=1 WHERE id=2
    
      commit transaction
    
    end try
    
    begin catch
      raiserror('Message here', 16, 1)
      rollback transaction
    end catch
    
    0 讨论(0)
提交回复
热议问题