SQL Server事务简单使用

来源:互联网 发布:python 密度估计 编辑:程序博客网 时间:2024/06/07 23:12

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

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 offbegin 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在存储过程中编写事务处理代码的三种方法

0 0
原创粉丝点击