关于事务回滚,有些不明白,不知道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 |