默認行為
默認為SET XACT_ABORT OFF,沒有事務行為。
SET XACT_ABORT ON
SET XACT_ABORT ON分為兩種:
1、總體作為一個事務,整體提交或整體回滾,格式為:
SET XACT_ABORT ON
BEGIN TRAN
--要執行的語句
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)
*/
