sqlserver事务与回滚

    技术2022-05-12  17

    事务不是有错就回滚的,在不写rollback的情况下,并不是什么错误都会回滚事务,有时回滚当前语句,有时回滚整个事务

    如例

    begin tran insert into dbo.area values('1111')insert into dbo.area values('2222')select 1/0insert 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/0insert into dbo.area values('333')commit

     

    但也有人写一堆@@error,如

    begin tran

    insert into dbo.area values('1111')

    if @@error>0

    rollbackinsert into dbo.area values('2222')

    if @@error>0

    rollbackselect 1/0

    if @@error>0

    rollbackinsert into dbo.area values('333')

    if @@error>0

    rollbackcommit

     

    当然也行,不过写起来太麻烦了

    后来发现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')   COMMITEND TRYBEGIN CATCH   IF @@TRANCOUNT > 0     ROLLBACK  DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int  SELECT @ErrMsg = ERROR_MESSAGE(),         @ErrSeverity = ERROR_SEVERITY()  RAISERROR(@ErrMsg, @ErrSeverity, 1)END CATCH

     

    不过还是没有第一种好哈


    最新回复(0)