XACT_ABORT 用法
首先創建一張表
Create Table TranTable
(
Id INT IDENTITY(1,1) PRIMARY KEY,
Priority TINYINT--最大值255
)
1.再執行下面的語句:
set XACT_ABORT ON
begin tran
INSERT INTO TranTable VALUES(1)
INSERT INTO TranTable VALUES(256)
INSERT INTO TranTable VALUES(5)
commit tran
出現下面的message:
(1 row(s) affected)
Msg 220, Level 16, State 2, Line 4
Arithmetic overflow error for data type tinyint, value = 256.
有一條語句出錯整個事務回滾,沒有問題
2.當我們設置 set XACT_ABORT OFF
執行後出現下面的Message
(1 row(s) affected)
Msg 220, Level 16, State 2, Line 4 Arithmetic overflow error for data type tinyint, value = 256. The statement has been terminated.
(1 row(s) affected)
每條語句都是各自爲事務,沒有整個事務回滾
這時候就需要通過捕獲異常,回滾事務
Message 信息:
(1 row(s) affected)
(0 row(s) affected)
整個事務回滾
3.執行下面的腳本,注意沒有 begin tran
set XACT_ABORT ON
go
begin
INSERT INTO TranTable VALUES(1)
INSERT INTO TranTable VALUES(256)
INSERT INTO TranTable VALUES(5)
end
Message 信息:
(1 row(s) affected)
Msg 220, Level 16, State 2, Line 4
Arithmetic overflow error for data type tinyint, value = 256.
每個語句作爲一個事務,事務在錯誤行終止,錯誤行回滾,錯誤行之前的不回滾
PS:
新建一個連接,執行下面的腳本:
INSERT INTO TranTable VALUES(1)
INSERT INTO TranTable VALUES(256)
INSERT INTO TranTable VALUES(5)
發現有插進了兩條數據
如果執行下面的腳本
INSERT INTO TranTable VALUES(1)
select ff from TranTable -- 沒有ff這一列
INSERT INTO TranTable VALUES(5)
會發現三條語句作爲一個事務,整體回滾
也許就應了這句話的解釋:在事務中,回滾一個語句還是整個事務視錯誤的嚴重程序而定,用戶級錯誤一般不會回滾整個事務
set XACT_ABORT OFF 爲默認設置,是否回滾整個事務也是要看錯誤的級別