指定當 Transact-SQL 語句產生運行時錯誤時,Microsoft? SQL Server? 是否自動回滾當前事務。分佈式
SET XACT_ABORT { ON | OFF }spa
當 SET XACT_ABORT 爲 ON 時,若是 Transact-SQL 語句產生運行時錯誤,整個事務將終止並回滾。爲 OFF 時,只回滾產生錯誤的 Transact-SQL 語句,而事務將繼續進行處理。編譯錯誤(如語法錯誤)不受 SET XACT_ABORT 的影響。orm
對於大多數 OLE DB 提供程序(包括 SQL Server),隱性或顯式事務中的數據修改語句必須將 XACT_ABORT 設置爲 ON。惟一不須要該選項的狀況是提供程序支持嵌套事務時。有關更多信息,請參見分佈式查詢和分佈式事務。blog
SET XACT_ABORT 的設置是在執行或運行時設置,而不是在分析時設置。事務
1.默認爲SET XACT_ABORT OFF 即遇到錯誤時回滾(真是暈,這不叫回滾,遇到錯誤固然不能執行了)因此乾脆說默認回滾不起做用。
2.SET XACT_ABORT OFF
。。。
COMMIT TRAN
這時纔是所謂真正的事務,遇到任何錯誤事務回滾
3.SET XACT_ABORT OFF
。。。
這時遇到錯誤時事務回滾,錯誤前的操做正常
另@@IDENTITY 系統產銷
==============================
理解 @@IDENTITY
@@IDENTITY 返回最後一個插入 IDENTITY 的值,這些操做包括:INSERT, SELECT INTO,或者 bulk copy。若是在給沒有 IDENTITY 列的其餘表插入記錄,系統將其置爲 null。若是有多行記錄插入到 IDENTITY 表中,@@IDENTITY 表示最後一個產生的值。若是觸發了某個觸發器,而且這個觸發器執行向另外一個帶有 IDENTITY 列的表的插入操做,@@IDENTITY 將返回這個由觸發器產生的值。若是這個觸發器插入的表中不包含 IDENTITY 列,那麼 @@IDENTITY 將爲 null。若是插入操做失敗,@@IDENTITY 值依然會增長,因此 IDENTITY 不保證數據的連續性。
get
1、各類用法及輸出結果:it
一、語句1:編譯
use demo
--Invoking a run-time error
SET XACT_ABORT OFF
BEGIN TRAN
INSERT INTO score VALUES (101,90)
INSERT INTO score VALUES (102,78)
INSERT INTO score VALUES (107,76)
INSERT INTO score VALUES (103,81)
INSERT INTO score VALUES (104,65)
COMMIT TRAN
goselect
結果1:只回滾錯誤行,語句還繼續執行。語法
--select * from score
101 90
102 78
103 81
104 65
二、語句2:
use demo
--事務回滾
SET XACT_ABORT on
BEGIN TRAN
INSERT INTO score VALUES (101,90)
INSERT INTO score VALUES (102,78)
INSERT INTO score VALUES (107,76)
INSERT INTO score VALUES (103,81)
INSERT INTO score VALUES (104,65)
COMMIT TRAN
go
結果2:事務終止並所有回滾,結果爲空。
--select * from score
三、語句3:
use demo
--事務在錯誤行終止,錯誤行回滾,錯誤行以前的不回滾
SET XACT_ABORT on
BEGIN
INSERT INTO score VALUES (101,90)
INSERT INTO score VALUES (102,78)
INSERT INTO score VALUES (107,76)
INSERT INTO score VALUES (103,81)
INSERT INTO score VALUES (104,65)
END
go
結果3:出現這種是由於系統把每一個insert語句都當作是單獨的事務,因此錯誤行之前的是不回滾的。
--select * from score
101 90
102 78