SQL事務回滾


BEGIN TRAN標記事務開始

COMMIT TRAN 提交事務

一般把DML語句(select ,delete,update,insert語句)放在BEGIN TRAN...COMMIT TRAN 之間作為一個事務處理

也就是那些語句執行過程中如果遇到錯誤,無論哪句遇到錯誤,所有語句都會回滾到BEGIN TRAN之前的狀態。

聯機幫助:當 SET XACT_ABORT 為 ON 時,如果執行 Transact-SQL 語句產生運行時錯誤,則整個事務將終止並回滾。 當 SET XACT_ABORT 為 OFF 時,有時只回滾產生錯誤的 Transact-SQL 語句,而事務將繼續進行處理。如果錯誤很嚴重,那么即使 SET XACT_ABORT 為 OFF,也可能回滾整個事務。

1、回滾語句1:

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

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

--select * from score

101     90

102     78

103     81

104     65

2、回滾語句2:

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

   結果2:事務終止並全部回滾,結果為空。

--select * from score

3、回滾語句3:

事務在錯誤行終止,錯誤行回滾,錯誤行之前的不回滾

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

      結果3:出現這種是因為系統把每個insert語句都看成是單獨的事務,所以錯誤行以前的是不回滾的。

--select * from score

101     90

102     78

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM