sqlserver事务与回滚

本文探讨了SQL中事务处理的不同方式,包括使用setXACT_ABORT、@@error及try-catch结构来确保事务一致性,并对比了各种方法的优劣。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

事务不是有错就回滚的,在不写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

 

不过还是没有第一种好哈

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值