SQL SET XACT_ABORT各种用法及显示结果

Posted liangzaian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL SET XACT_ABORT各种用法及显示结果相关的知识,希望对你有一定的参考价值。

/*
    SET XACT_ABORT各种用法及显示结果
    
  默认为SET XACT_ABORT OFF,没有事务行为。
    
  SET XACT_ABORT ON分为两种:
 
  1、总体作为一个事务,整体提交或整体回滚,格式为: 
        SET XACT_ABORT ON
        BEGIN TRAN
            --要执行的语句    
        COMMIT TRAN
        GO

  2、每个语句作为一个事务,事务在错误行终止,错误行回滚,错误行之前的不回滚,格式为: 
        SET XACT_ABORT ON
        BEGIN
            --要执行的语句
        END
        GO
*/
 

CREATE TABLE student
(    
        stuid int NOT NULL PRIMARY KEY,
        stuname varchar(50)
)
CREATE TABLE score 
(
        stuid int NOT NULL REFERENCES student(stuid),
        score int
)
GO
 
--插入测试数据
INSERT INTO student VALUES (101,‘zhangsan‘) 
INSERT INTO student VALUES (102,‘wangwu‘) 
INSERT INTO student VALUES (103,‘lishi‘) 
INSERT INTO student VALUES (104,‘maliu‘) 
GO
 
---------------测试事务提交------------------

--只回滚错误行,错误行之后的语句还继续执行
SET XACT_ABORT OFF
BEGIN TRAN
    INSERT INTO score  VALUES (101,90)
    INSERT INTO score VALUES (102,78) 
    INSERT INTO score VALUES (107,76) /* Foreign Key Error */ 
    INSERT INTO score VALUES (103,81) 
    INSERT INTO score VALUES (104,65) 
COMMIT TRAN
GO
/*
stuid       score
----------- -----------
101         90
102         78
103         81
104         65
 
(4 row(s) affected)
*/
 
--DELETE FROM dbo.score

--总体做为一个事务,事务终止并全部回滚

SET XACT_ABORT ON
BEGIN TRAN
    INSERT INTO score  VALUES (101,90)
    INSERT INTO score VALUES (102,78) 
    INSERT INTO score VALUES (107,76) /* Foreign Key Error */ 
    INSERT INTO score VALUES (103,81) 
    INSERT INTO score VALUES (104,65) 
COMMIT TRAN
GO

/*
stuid       score
----------- -----------
(0 row(s) affected)
*/
 
/*
    每个语句作为一个事务,事务在错误行终止,
    错误行回滚,错误行之前的不回滚,
    错误行之后的不执行
*/

SET XACT_ABORT ON
BEGIN
    INSERT INTO score  VALUES (101,90)
    INSERT INTO score VALUES (102,78) 
    INSERT INTO score VALUES (107,76) /* Foreign Key Error */ 
    INSERT INTO score VALUES (103,81) 
    INSERT INTO score VALUES (104,65) 
END
GO
/*
stuid       score
----------- -----------
101         90
102         78
(2 row(s) affected)
*/

--DROP TABLE score,student

GO
 

  

以上是关于SQL SET XACT_ABORT各种用法及显示结果的主要内容,如果未能解决你的问题,请参考以下文章

如何使 SET XACT_ABORT ON 回滚事务?

linux下set命令的参数及用法

在存储过程中写SET XACT_ABORT ON 有什么用,不写会发生什么问题

postgres 中 SET XACT_ABORT ON 的替代方法是啥

存储过程中的 SET XACT_ABORT ON 和事务

XACT_ABORT 不回滚 SQL Server 2012 上的事务