• 关于事务回滚,rollback tran到底要不要写?


    关于事务回滚,有些不明白,不知道rollback tran在什么时候用。

    begin tran

    update 表1

    update 表2

    commit tran

    这种写法,在更新表1或表2时出错,事务会不会自动回滚?

    如果要加上rollback tran应该加在什么地方?每执行更新表后都用if @@error<>0 rollback tran做个判断吗?
    --我比较习惯加xact_abort选项
     
    SET XACT_ABORT ON 
     
    begin tran
     
    update 表1
     
    update 表2
     
    commit tran 
    BEGIN TRANSACTION
      BEGIN TRY
        sql_statement
        COMMIT
      END TRY
      BEGIN CATCH
         ROLLBACK TRANSACTION
      END CATCH
    begin tran 
     
    update 表1 
    if @@error<>0
    begin
       rollback tran
       return
    end
     
        
     
    update 表2 
    if @@error<>0
    begin
       rollback tran
       return
    end
     
    commit tran 
    就看你的set XACT_ABORT 是on还是off了.

    当 SET XACT_ABORT 为 ON 时,如果 Transact-SQL 语句产生运行时错误,整个事务将终止并回滚。为 OFF 时,只回滚产生错误的 Transact-SQL 语句,而事务将继续进行处理。

    1.set XACT_ABORT off

    set XACT_ABORT off

    begin tran

    update 表1

    update 表2

    commit tran 

    结论:如果第二个语句发生错误,那么整个事务将会忽略而提交。因此会造成你的数据的不一致的现象。因此这种情况需要对错误进行判断,如:if @@error <>0 rollback tran

    2.set XACT_ABORT on

    set XACT_ABORT on

    begin tran

    update 表1

    update 表2

    commit tran 

    结论:如果第二个语句发生错误,,那么整个事务将会自动的回滚。因此可以保证你的数据的一致性,因此不需要对错误进行判断。
    上面写错了
    declare @flag int 
    set @flag=0 
    begin tran 

    update 表1 
    if @@error <>0
      begin 
          set @flag=1 
          goto exe0 
      end 
    update 表2 
    if @@error <>0
      begin 
          set @flag=1 
          goto exe0 
      end 
    exe0: 
    if @flag=0 
      Begin 
          commit tran 
      End 
    Else 
      Begin 
          rollback 
      End 
  • 相关阅读:
    如何写Makefile?
    C语言变量的存储类别详解
    Longest Palindrome Substring
    Count Primes
    Closest Binary Search
    Search Insert Position
    Set Matrix Zeros ****
    Search for a Range
    Two Sum II
    Jump Game
  • 原文地址:https://www.cnblogs.com/jijm123/p/10569863.html
Copyright © 2020-2023  润新知