首页 > 代码库 > SQL SET XACT_ABORT各种用法及显示结果

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各种用法及显示结果