存儲過程中XACT_ABORT 用法

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 爲默認設置,是否回滾整個事務也是要看錯誤的級別

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章