关于事务回滚,有些不明白,不知道rollback tran在什么时候用。
begin tran
update 表1
update 表2
commit tran
这种写法,在更新表1或表2时出错,事务会不会自动回滚?
如果要加上rollback tran应该加在什么地方?每执行更新表后都用if @@error <>0 rollback tran做个判断吗?
这个问题第1个回答:
05用try..catch..
这个问题第2个回答:
SQL code
--我比较习惯加xact_abort选项
SET XACT_ABORT ON
begin tran
update 表1
update 表2
commit tran
这个问题第3个回答:
SQL code
BEGIN TRANSACTION
BEGIN TRY
sql_statement
COMMIT
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
END CATCH
这个问题第4个回答:
2000的写法:
SQL code
begin tran
update 表1
if @@error<>0
begin
rollback tran
return
end
update 表2
if @@error<>0
begin
rollback tran
return
end
commit tran
这个问题第5个回答:
就看你的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
结论:如果第二个语句发生错误,,那么整个事务将会自动的回滚。因此可以保证你的数据的一致性,因此不需要对错误进行判断。
这个问题第6个回答:
begin tran
update 表1
update 表2
if @@error=0
commit tran
else
rollback tran
这个问题第7个回答:
TO wufeng4552 :
begin tran
update 表1
update 表2
if @@error=0
commit tran
else
rollback tran
--------------
这种写法会不会不安全呢? 因为每次update之后都会改变@error的值 ,假如第一次update时出错了,那么这个时间@error的值非0,但第二次update时正确了,这个时候@error被改写为0,正好符合if @@error=0 commit tran 的条件,所以没有回滚。
这个问题第8个回答:
我刚做了一个测试,发现数据并没有回滚,不知道是什么问题
SET XACT_ABORT ON
begin tran
delete t1 where 产品编号='03'
if @@error <>0
begin
rollback tran
return
end
delete t22 where id='1'
if @@error <>0
begin
rollback tran
return
end
commit tran
说明:第二次delete时t22这个表是不存在的,既然表不存在,那么就会出错,这种错误事务会不会自动回滚呢? 测试结果是没有回滚,T1表中的03数据被删除。
这个问题第9个回答:
每执行更新表后都用
update
if @@error <>0
rollback tran
update
if @@error <>0
rollback tran
commit tran
做个判断
这个问题第10个回答:
谢谢各位
这个问题第11个回答:
declare @flag int
set @flag=0
begin tran
update 表1
if @@error <>03
begin
set @flag=1
goto exe0
end
update 表2
if @@error <>03
begin
set @flag=1
goto exe0
end
exe0:
if @flag=0
Begin
commit tran
End
Else
Begin
rollback
End
这个问题第12个回答:
上面写错了
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