Sqlserver中事務的寫法

SET XACT_ABORT

指定當 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:編譯

在存儲過程當中編寫正確的事務處理代碼(SQL <wbr>Server <wbr>2000 <wbr>& <wbr>2005)use demo
在存儲過程當中編寫正確的事務處理代碼(SQL <wbr>Server <wbr>2000 <wbr>& <wbr>2005) 
在存儲過程當中編寫正確的事務處理代碼(SQL <wbr>Server <wbr>2000 <wbr>& <wbr>2005) 
--Invoking a run-time error
在存儲過程當中編寫正確的事務處理代碼(SQL <wbr>Server <wbr>2000 <wbr>& <wbr>2005) 
SET XACT_ABORT OFF
在存儲過程當中編寫正確的事務處理代碼(SQL <wbr>Server <wbr>2000 <wbr>& <wbr>2005) 
BEGIN TRAN
在存儲過程當中編寫正確的事務處理代碼(SQL <wbr>Server <wbr>2000 <wbr>& <wbr>2005)     
INSERT INTO score  VALUES (101,90)
在存儲過程當中編寫正確的事務處理代碼(SQL <wbr>Server <wbr>2000 <wbr>& <wbr>2005)     
INSERT INTO score VALUES (102,78
在存儲過程當中編寫正確的事務處理代碼(SQL <wbr>Server <wbr>2000 <wbr>& <wbr>2005)    
INSERT INTO score VALUES (107,76 
在存儲過程當中編寫正確的事務處理代碼(SQL <wbr>Server <wbr>2000 <wbr>& <wbr>2005)     
INSERT INTO score VALUES (103,81
在存儲過程當中編寫正確的事務處理代碼(SQL <wbr>Server <wbr>2000 <wbr>& <wbr>2005)     
INSERT INTO score VALUES (104,65
在存儲過程當中編寫正確的事務處理代碼(SQL <wbr>Server <wbr>2000 <wbr>& <wbr>2005) 
COMMIT TRAN
在存儲過程當中編寫正確的事務處理代碼(SQL <wbr>Server <wbr>2000 <wbr>& <wbr>2005) 
goselect

      結果1:只回滾錯誤行,語句還繼續執行。語法

在存儲過程當中編寫正確的事務處理代碼(SQL <wbr>Server <wbr>2000 <wbr>& <wbr>2005)--select * from score
在存儲過程當中編寫正確的事務處理代碼(SQL <wbr>Server <wbr>2000 <wbr>& <wbr>2005) 
101    90
在存儲過程當中編寫正確的事務處理代碼(SQL <wbr>Server <wbr>2000 <wbr>& <wbr>2005) 
102    78
在存儲過程當中編寫正確的事務處理代碼(SQL <wbr>Server <wbr>2000 <wbr>& <wbr>2005) 
103    81
在存儲過程當中編寫正確的事務處理代碼(SQL <wbr>Server <wbr>2000 <wbr>& <wbr>2005) 
104    65

      二、語句2:

在存儲過程當中編寫正確的事務處理代碼(SQL <wbr>Server <wbr>2000 <wbr>& <wbr>2005)use demo
在存儲過程當中編寫正確的事務處理代碼(SQL <wbr>Server <wbr>2000 <wbr>& <wbr>2005) 
在存儲過程當中編寫正確的事務處理代碼(SQL <wbr>Server <wbr>2000 <wbr>& <wbr>2005) 
--事務回滾
在存儲過程當中編寫正確的事務處理代碼(SQL <wbr>Server <wbr>2000 <wbr>& <wbr>2005) 
SET XACT_ABORT on
在存儲過程當中編寫正確的事務處理代碼(SQL <wbr>Server <wbr>2000 <wbr>& <wbr>2005) 
BEGIN TRAN
在存儲過程當中編寫正確的事務處理代碼(SQL <wbr>Server <wbr>2000 <wbr>& <wbr>2005)     
INSERT INTO score  VALUES (101,90)
在存儲過程當中編寫正確的事務處理代碼(SQL <wbr>Server <wbr>2000 <wbr>& <wbr>2005)     
INSERT INTO score VALUES (102,78
在存儲過程當中編寫正確的事務處理代碼(SQL <wbr>Server <wbr>2000 <wbr>& <wbr>2005)    
INSERT INTO score VALUES (107,76 
在存儲過程當中編寫正確的事務處理代碼(SQL <wbr>Server <wbr>2000 <wbr>& <wbr>2005)     
INSERT INTO score VALUES (103,81
在存儲過程當中編寫正確的事務處理代碼(SQL <wbr>Server <wbr>2000 <wbr>& <wbr>2005)     
INSERT INTO score VALUES (104,65
在存儲過程當中編寫正確的事務處理代碼(SQL <wbr>Server <wbr>2000 <wbr>& <wbr>2005) 
COMMIT TRAN
在存儲過程當中編寫正確的事務處理代碼(SQL <wbr>Server <wbr>2000 <wbr>& <wbr>2005) 
go

      結果2:事務終止並所有回滾,結果爲空。

在存儲過程當中編寫正確的事務處理代碼(SQL <wbr>Server <wbr>2000 <wbr>& <wbr>2005)--select * from score
在存儲過程當中編寫正確的事務處理代碼(SQL <wbr>Server <wbr>2000 <wbr>& <wbr>2005)

      三、語句3:

在存儲過程當中編寫正確的事務處理代碼(SQL <wbr>Server <wbr>2000 <wbr>& <wbr>2005)use demo
在存儲過程當中編寫正確的事務處理代碼(SQL <wbr>Server <wbr>2000 <wbr>& <wbr>2005) 
在存儲過程當中編寫正確的事務處理代碼(SQL <wbr>Server <wbr>2000 <wbr>& <wbr>2005) 
--事務在錯誤行終止,錯誤行回滾,錯誤行以前的不回滾
在存儲過程當中編寫正確的事務處理代碼(SQL <wbr>Server <wbr>2000 <wbr>& <wbr>2005) 
SET XACT_ABORT on
在存儲過程當中編寫正確的事務處理代碼(SQL <wbr>Server <wbr>2000 <wbr>& <wbr>2005) 
BEGIN
在存儲過程當中編寫正確的事務處理代碼(SQL <wbr>Server <wbr>2000 <wbr>& <wbr>2005) 
INSERT INTO score  VALUES (101,90)
在存儲過程當中編寫正確的事務處理代碼(SQL <wbr>Server <wbr>2000 <wbr>& <wbr>2005)     
INSERT INTO score VALUES (102,78
在存儲過程當中編寫正確的事務處理代碼(SQL <wbr>Server <wbr>2000 <wbr>& <wbr>2005)    
INSERT INTO score VALUES (107,76 
在存儲過程當中編寫正確的事務處理代碼(SQL <wbr>Server <wbr>2000 <wbr>& <wbr>2005)     
INSERT INTO score VALUES (103,81
在存儲過程當中編寫正確的事務處理代碼(SQL <wbr>Server <wbr>2000 <wbr>& <wbr>2005)     
INSERT INTO score VALUES (104,65
在存儲過程當中編寫正確的事務處理代碼(SQL <wbr>Server <wbr>2000 <wbr>& <wbr>2005) 
END
在存儲過程當中編寫正確的事務處理代碼(SQL <wbr>Server <wbr>2000 <wbr>& <wbr>2005) 
go

      結果3:出現這種是由於系統把每一個insert語句都當作是單獨的事務,因此錯誤行之前的是不回滾的。

在存儲過程當中編寫正確的事務處理代碼(SQL <wbr>Server <wbr>2000 <wbr>& <wbr>2005)--select * from score
在存儲過程當中編寫正確的事務處理代碼(SQL <wbr>Server <wbr>2000 <wbr>& <wbr>2005) 
101    90
在存儲過程當中編寫正確的事務處理代碼(SQL <wbr>Server <wbr>2000 <wbr>& <wbr>2005) 
102    78

相關文章
相關標籤/搜索