SET XACT_ABORT各种用法及显示结果

SET XACT_ABORT各种用法及显示结果
 
默认行为
  默认为SET XACT_ABORT OFF,没有事务行为。
  www.2cto.com  
SET XACT_ABORT ON
  SET XACT_ABORT ON分为两种:
 
  1、总体作为一个事务,整体提交或整体回滚,格式为:
 
SET XACT_ABORT ON
BEGIN TRAN
    --要执行的语句  www.2cto.com  
COMMIT TRAN
GO
  2、每个语句作为一个事务,事务在错误行终止,错误行回滚,错误行之前的不回滚,格式为:
 
SET XACT_ABORT ON
BEGIN
    --要执行的语句
END
GO
测试
 
--创建测试表
use MyDB
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
 
---------------测试事务提交------------------
use MyDB
--只回滚错误行,语句还继续执行
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)
*/
 
use MyDB
--事务终止并全部回滚
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)
*/
 
use MyDB
--事务在错误行终止,错误行回滚,错误行之前的不回滚
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)
*/
 
来源 http://www.cnblogs.com/rob0121/articles/2320932. html

你可能感兴趣的:(SET XACT_ABORT各种用法及显示结果)