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

 

不过还是没有第一种好哈

posted on 2012-05-31 10:40  沈建宏  阅读(177)  评论(0编辑  收藏  举报

导航