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