SQL 回滚事务【转】
事务不是有错就回滚的,在不写rollback的情况下,并不是什么错误都会回滚事务,有时回滚当前语句,有时回滚整个事务
如例
begin tran
insert into dbo.area values('1111')
insert into dbo.area
values('2222')
select 1/0
insert into dbo.area values('333')
commit
像这样,就算中间有错,也不会回滚,结果会成功添加三条记录
但有人说,比如重大错误,这事务也会所有回滚,只是我无法重现重大错误罢了
普通错误如果想回滚整个事务,只要加个set XACT_ABORT on就可以了
set XACT_ABORT on
begin tran
insert into dbo.area values('1111')
insert into dbo.area
values('2222')
select 1/0
insert into dbo.area values('333')
commit
但也有人写一堆@@error,如
begin tran
insert into dbo.area values('1111')
if @@error>0
rollback
insert into dbo.area values('2222')
if @@error>0
rollback
select 1/0
if @@error>0
rollback
insert into dbo.area values('333')
if @@error>0
rollback
commit
当然也行,不过写起来太麻烦了
后来发现sql2005支持try
BEGIN
TRY
BEGIN TRANSACTION
insert into dbo.area values('1111')
insert into dbo.area
values('2222')
select 1/0
insert into dbo.area
values('333')
COMMIT
END TRY
BEGIN CATCH
IF
@@TRANCOUNT > 0
ROLLBACK
DECLARE
@ErrMsg nvarchar(4000), @ErrSeverity int
SELECT @ErrMsg
=
ERROR_MESSAGE(),
@ErrSeverity =
ERROR_SEVERITY()
RAISERROR(@ErrMsg,
@ErrSeverity, 1)
END CATCH
不过还是没有第一种好哈