alter procedure pro_test
   as
     set xact_abort on
     begin tran
       --step 1       --step 2
  
       --step 3       --step 4
     commit tran

解决方案 »

  1.   

    set xact_abort on
    有错事务就会回滚
      

  2.   

    如果批处理中出现运行时语句错误(如违反约束),那么 SQL Server 中默认的行为将是只回滚产生该错误的语句。可以使用 SET XACT_ABORT 语句改变该行为。在 SET XACT_ABORT ON 语句执行之后,任何运行时语句错误都将导致当前事务自动回滚。编译错误(如语法错误)不受 SET XACT_ABORT 的影响
      

  3.   

    alter procedure pro_test
       as
       declare @err1 int,@err2 int,@err3 int,@err4 int
         begin tran
           --step 1    set @err1=@error
           --step 2
      
        set @err2=@error
           --step 3    set @err3=@error
           --step 4    set @err4=@error     if   (@err1+@err2+@err3+@err4)=0
          COMMIT TRAN
         ELSE
           ROLLBACK TRAN
      

  4.   

    alter procedure pro_test
       as
       declare @err1 int,@err2 int,@err3 int,@err4 int
         begin tran
           --step 1    set @err1=@@error
           --step 2
      
        set @err2=@@error
           --step 3    set @err3=@@error
           --step 4    set @err4=@@error     if   (@err1+@err2+@err3+@err4)=0
          COMMIT TRAN
         ELSE
           ROLLBACK TRAN
      

  5.   

    如果用@@error,需要在每一个sql语句后边判断或者读取@@error的值,当你的存储过程代码很多的时候,显得非常烦琐.还是用set xact_abort on比较直观