SQL Server 事务简单使用

首先关于事务的几个操作如下:

begin tran      -- 开启事务
commit tran     -- 提交事务
rollback tran   -- 回滚事务

-- 新建一个测试表demo,id自增
create table demo
(
    id int not null IDENTITY(1,1),
    val int not null
)

insert into demo values (5)  
insert into demo values (2) 

select * from demo

这里写图片描述


set xact_abort on   -- 设置当运行发生错误时,整个事务终止并回滚

begin tran   -- 开启事务
insert into demo values (5)  
insert into demo values (2) 
insert into demo values (5)  
insert into demo values (null)
insert into demo values (6)  
commit tran   -- 提交事务
go 

当执行到 insert into demo values (null) 这一句时会发生错误,因为设置了 set xact_abort on ,因此所有操作会回滚。

操作结果:
这里写图片描述

再看一下数据

select * from demo

这里写图片描述
跟刚刚一样,数据没有增加。


接下来对比一下不设置 xact_abort on 的情况。

set xact_abort off

begin tran   -- 开启事务
insert into demo values (5)  
insert into demo values (2) 
insert into demo values (5)  
insert into demo values (null)
insert into demo values (6)  
commit tran   -- 提交事务
go 

这里写图片描述

数据:

select * from demo

这里写图片描述
可以看到除了 insert into demo values (null) 这一句,其他数据是有插到数据库的。


注意:
关于事务回滚还有一点,我建的 demo 表的 id 字段是自增的。
看最后的那张图,id=2 的下一条是 id=7,这说明了其实除了insert into demo values (null) 这一句,其他语句是已经执行了,插入到数据库了的,只是因为遇到错误回滚时又把它们删除了。所以再插入的时候 id 就是从7开始了。


PS:其实不使用 set xact_abort on 也可以手动捕捉错误进行回滚。

这里只是简单介绍一下。

  1. 在每个单独的DML语句执行后,立即判断执行状态,并做相应处理。
begin transaction  

declare @errorSum int      --定义局部变量   
set @errorSum=0  --初始化临时变量  

update bank set currentMoneycurrentMoney= currentMoney-1000 where customerName='张三' 
set @errorSum=@errorSum+@@error    --累计是否有错误  
update bank set currentMoneycurrentMoney= currentMoney+1000 where customerName='李四' 
set @errorSum=@errorSum+@@error    --累计是否有错误  
if @errorSum<>0     --如果有错误  
begin  
rollback transaction  
end  

else  
begin  
commit  transaction  
end  

go 



2. 可利用 try…catch 异常处理机制。

begin tran 

begin try   
update statement 1 ...   
delete statement 2 ...   
endtry   

begin catch  
if @@trancount > 0   
rollback tran   
end catch  

if @@trancount > 0   
commit tran  
go 

参考:
一个SQL Server数据库事务的使用示例
SQL Server在存储过程中编写事务处理代码的三种方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值