关于事务回滚,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 

猜你喜欢

转载自www.cnblogs.com/jijm123/p/10569863.html