zoukankan      html  css  js  c++  java
  • 关于事务回滚,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 
  • 相关阅读:
    Ubuntu18.04 环境下 解决VScode中空格长度减小的问题
    IPython notebook(Jupyter notebook) 设置密码
    IPython notebook(Jupyter notebook)指定IP和端口运行
    ubuntu系统下 vscode中如何指定conda环境
    《Bitcoin: A Peer-to-Peer Electronic Cash System》 中本聪写的比特币白皮书
    QT-vs各个版本的编译器号对应的vs版本号
    惯性导航的组成
    论文引用格式
    SCI正刊和特刊(专刊/增刊)的区别是什么?
    python glob.glob() 函数
  • 原文地址:https://www.cnblogs.com/jijm123/p/10569863.html
Copyright © 2011-2022 走看看