分享

SQL事务回滚的两种方式

 hdzgx 2019-12-09

1.XACT_ABORT

1)set XACT_ABORT off时,回滚产生错误的Transact-SQL语句,而事务将继续进行处理,(注:错误严重或者语法错误时可能回滚整个事务)

2) set XACT_ABORT ON时,如果Transact-SQL语句产生运行时错误,整个事务将终止并回滚,

步骤1:

  1. CREATE TABLE [dbo].[A](
  2. [ID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
  3. [Name] [nvarchar](5) NULL,
  4. [CreateDate] [datetime] NULL,
  5. CONSTRAINT [PK_A] PRIMARY KEY CLUSTERED
  6. (
  7. [ID] ASC
  8. )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
  9. ) ON [PRIMARY]
  10. GO
  11. --默认XACT_ABORT=off
  12. SET XACT_ABORT off
  13. begin tran
  14. insert into [dbo].[A](Name,CreateDate) values('测试off',GETDATE());
  15. insert into [dbo].[A](Name,CreateDate) values('测试off_异常',GETDATE());
  16. insert into [dbo].[A](Name,CreateDate) values('测试off',GETDATE());
  17. commit tran


(1 行受影响)
消息 8152,级别 16,状态 4,第 3 行
将截断字符串或二进制数据。
语句已终止。

(1 行受影响)

select * from [dbo].[A]
ID Name CreateDate
1          测试off

 2018-10-31 15:06:09.330

3 测试off 2018-10-31 15:06:09.333

 

注意:

事务的回滚对于拥有自增主键的表来说,insert的数据是被删除,update和delete的数据是被恢复  。所以上面所显示的ID=3 。

步骤2:

  1. set XACT_ABORT ON
  2. begin tran
  3. insert into [dbo].[A](Name,CreateDate) values('测试on',GETDATE());
  4. insert into [dbo].[A](Name,CreateDate) values('测试on_异常',GETDATE());
  5. insert into [dbo].[A](Name,CreateDate) values('测试on',GETDATE());
  6. commit tran

同样执行select 查询语句  得到如下结果

ID Name CreateDate
1          测试off

 2018-10-31 15:06:09.330

3 测试off 2018-10-31 15:06:09.333

证明事务全部回滚成功。(注意下次新增数据的时候,ID的值。。。)

 

2.rollback

在sql中用事务的时候一般是这么写。
 

  1. declare @error int ;
  2. begin tran
  3. begin try
  4. insert into [dbo].[A](Name,CreateDate) values('测试异常',GETDATE());
  5. insert into [dbo].[A](Name,CreateDate) values('测试异常_错误',GETDATE());
  6. insert into [dbo].[A](Name,CreateDate) values('测试异常',GETDATE());
  7. end try
  8. begin catch
  9. set @error=1
  10. end catch
  11. if @error>0
  12. rollback tran
  13. else
  14. commit tran

注:

判断事务回滚,则整个事务里面的sql语句一起回滚,跟SET XACT_ABORT ON相似,不同的是当事务进行嵌套时,如果用事务判断的方法,嵌套的子事务不出错,外面语句出错,那么整个事务只会回滚外面出错的语句,子事务提交成功了就回滚不了了,但是用SET XACT_ABORT ON,即使子事务提交成功,如果外围事务出错,子事务还是回滚.

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多