SQL Server 中的回滚

2019-09-02 16:07| 发布者: |

默认情况下如果执行一个事务中出现错误,则只回滚错误操作语句,错误处之前或之后的正确操作语句还是会被提交。如:

use testdb
begin 澳门皇冠真人网站transaction
 insert into person
 values
 insert into person
 values
 insert into person
 values
commit transaction
 select 一下 有'1','name1'和'3','name3',
 说明只有第二句的错误被取消了
*/

全部回滚的方法1:打开 xact_abort

use testdb
set xact_abort on -- 打开
begin transaction
 insert into person
 values
 insert into person
 values
 insert into person
 values
commit transaction
 当 set xact_abort 为 on 时,
 如果执行 transact-sql 语句产生运行时错误,
 则整个事务将终止并回滚。 
 默认情况下它是off状态。
*/

全部回滚方法2:使用try...catch

use testdb
begin try
  begin transaction
  insert into person
  values
  insert into person
  values
  insert into person
  values
  commit transaction
end try
begin catch
  rollback transaction
end catch
/*
  使用trycatch来捕获异常。
  如果 try 块内生成的错误导致当前事务的状态失效,
  则将该事务归类为不可提交的事务。
  如果通常在 try 块外中止事务的错误在 try 内发生时,
  就会导致事务进入不可提交状态。
  不可提交的事务只能执行读操作或 rollback transaction。
  该事务不能执行任何可能生成写操作或 commit transaction 的 transact-sql 语句。
  如果事务被分类为不可提交的事务,则 xact_state 函数会返回值 -1。
*/
























全部回滚方法3:自定义错误变量

use testdb
declare @tranerror int -- 定义变量
set @tranerror=0
 begin transaction
 insert into person
 values
 set @tranerror = @tranerror + @@error
 insert into person
 values
 set @tranerror = @tranerror + @@error
 insert into person
 values
 set @tranerror = @tranerror + @@error
 if @tranerror = 0
 commit transaction
 else
 rollback transaction
 自定义一个变量来判断最后是否发生过错误。
*/

最后要注意的是:如果一个事务写了 begin transaction 而没写 commit transaction 或 rollback transaction 则相关操作的数据会被锁住。。。而对于锁住的解决办法就是单独执行一下commit transaction 或 rollback transaction

<
>
关于我们
AB模版网成立于2014年,我们是一家专注用户体验设计开发与互联网品牌建设的设计公司,创立至今为2000多位客户提供了创新与专业的设计方案。设计服务范围包括:交互原型设计、产品视觉设计、网站设计与开发建设、移动及软件产品界面设计、图标设计、品牌及平面设计等。

联系我们

13588889999服务时间:9:00-18:00)

admin@adminbuy.cn

官方微信官方微信

部门热线

前   台:13588889999
业务部:13588889999
客服部:13588889999
技术部:13566667777
人事部:13566667777

咨询电话13588889999 返回顶部
返回顶部