




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、嵌套事務的回滾與提交、嵌套事務和事務保存點的錯誤處理1、對于嵌套事務。1. 外部起事務,內部起事務,內外都有Try Catch內部出錯:如果內部事務出錯,內部和外部事物全部回滾,外部回滾之前的操作全部不存在,但是之后的操作繼續執行。外部出錯:如果外部事物出錯,內部和外部事物全部回滾,外部回滾之前的操作全部不存在,但是之后的操作繼續執行。注:如果內部的事務不起事務名稱,內部如果出錯,將會回滾掉會話中的全部事務,而且報 異常。2. 外部起事務,內部起事務,內部沒有Try Catch內部出錯:如果內部事務出錯,內部和外部事物全部回滾,外部回滾之前的操作全部不存在,但是之后的操作繼續執行。外部出錯:如
2、果內部事務出錯,內部和外部事物全部回滾,外部回滾之前的操作全部不存在,但是之后的操作繼續執行。3. 外部起事務,內部不起事務,但有Try Catch 。內部出錯:外部事物正常提交,外部事物不會進入 ROLLBACK,內部出錯之后的記錄也會正 常執行。內部操作中, Try部分在錯誤出現之前的操作正常, Try部分在操作之后的操作不 執行,然后進入 Catch塊中執行操作。外部出錯:內部和外部事物全部回滾,外部回滾之前的操作全部不存在,但是之后的操作繼 續執行。4. 外部起事務,內部不起事務,但沒有Try Catch.內部出錯:如果內部事務出錯,內部和外部事物全部回滾,外部回滾之前的操作全部不存在
3、,但是之后的操作繼續執行。外部出錯:如果內部事務出錯,內部和外部事物全部回滾,外部回滾之前的操作全部不存在,但是之后的操作繼續執行。5. 外部不起事務,內部起事務,但有Try Catch.內部出錯:外部操作被正常執行,內部ROLLBACK操作前全部回滾,之后的操作正常執行。外部出錯:出錯操作之前的操作不會回滾,出錯之后的操作不執行,跳入Catch塊中,內部事務不會回滾。6. 外部不起事務,內部起事務,但沒有Try Catch.內部出錯:外部操作被正常執行,內部ROLLBACK操作前全部回滾。由于沒有catch塊,所以外部操作全部執行。外部出錯:內部事務正常提交,外部只有當條記錄失敗,其他操作正
4、常執行,但是有嚴重錯誤報出來。對于事務保存點事務保存點只有SAVE和ROLLBACK操作,當外部調用內部保存點,內部出現問題不影響外部事務,外部操作正常執行。當外部操作出現問題時,內部所有操作都回滾掉。如:外部起事務,內部起保存點,內外都有 Try Catch內部出錯:外部操作正常,不進入 Catch,內部事務回滾到保存點,之后的繼續執行。外部出錯:如果外部事物在保存點之前出現異常,那么外部和內部所有操作回滾。如果外部事物在保存點之前出現異常,由于保存點已經提交了事務,導致外部rollback找不到對應的 事務點。、事務的嵌套PRINT'Trancount before transac
5、tion:'+ CAST( TRANCOUNTas char ( 1)BEGINTRANPRINT'After first BEGIN TRAN:'+ CAST( TRANCOUNTas char ( 1)BEGINTRANPRINT'After seco nd BEGIN TRAN:'+ CAST( TRANCOUNTas char ( 1)COMMIT TRANPRINT 'After first COMMIT TRAN:'+ CAST( TRANCOUNTas char ( 1)COMMIT TRANPRINT 'After
6、 sec ond COMMIT TRAN:'+ CAST( TRANCOUNTas char ( 1)在結果中,可以看到每一個BEGINTRAN語句都會使TRANCOUNT增加1并且每一個COMMIT TRAN語句都會使其減少 1。如前所述,一個值為 0的TRANCOUN意味著沒有打BEGIN TRAN并結束于最后開的事務。因此,在TRANCOUN值從1降到0時結束的事務發生在外層事務提交的時候。因此,每一個內部事務都需要提交。由于事務起始于第一個 個COMMIT TRAN,因此最外層的事務決定了是否完全提交內部的事務。如果最外層的事務沒有被提交,其中嵌套的事務也不會被提交。鍵入并執行
7、以下批來檢驗事務回滾時所發生的情況:BEGINTRANPRINT'After 1st BEGIN TRAN:'+ CAST( TRANCOUNTas char ( 1)BEGIN TRANPRINT'After 2nd BEGIN TRAN:'+ CAST(TRANCOUNTas char ( 1)BEGINTRANPRINT'After 3rd BEGIN TRAN:'+ CAST( TRANCOUNTas char ( 1)UPDATE DatalSET value1 = 1000000WHEREId = 1COMMIT TRANPRINT
8、'After first COMMIT TRAN:'+ CAST( TRANCOUNTaschar (1)PRINT'After 2nd BEGIN TRAN:'+ CAST(TRANCOUNTas char ( 1)PRINT'After 2nd BEGIN TRAN:'+ CAST(TRANCOUNTas char ( 1)ROLLBACK TRANPRINT 'After ROLLBACK TRAN:'+ CAST( TRANCOUNTas char(1)PRINT'After 2nd BEGIN TRAN:'
9、;+ CAST(TRANCOUNTas char ( 1)PRINT'After 2nd BEGIN TRAN:'+ CAST(TRANCOUNTas char ( 1)SELECT * FROM Data1然后 ROLLBACKWHEREId = 1 ;在這個示例中,數據表Data1在一個嵌套事務中被更新,這會被立即提交。TRAN被執行。ROLLBACK TRAN將TRANCOUN減為0并回滾整個事務及其中嵌套的事務,。每一個 COMMIT無論它們是否已經被提交。因此,嵌套事務中所做的更新被回滾,數據沒有任何改變。始終牢記,在嵌套的事務中,只有最外層的事務決定著是否提交內部事
10、務TRAN語句總是應用于最后一個執行的BEGIN TRAN_。因此,對于每一個 COMMIT TRAN,必須調用一個 COMMIT TRAN來提交事務。ROLLBACK TRAN語句總是屬于最外層的事務,并且因此總是回滾整個事務而不論其中打開了多少嵌套事務。正因為此,管理嵌套事務很復雜。如果每一個嵌套存儲過程都在自身中開始一個事務,那么嵌套事務大部分會發生在嵌套存儲過程中。要避免嵌套事務,可以在過程開始處檢查TRANCOU NT勺值,以此來確定是否需要開始一個事務。如果 TRANCOUN大于0,因為過程已經處于一個事務中并且調用 實例可以在錯誤發生時回滾事務。二、存儲過程和觸發器中回滾如果TR
11、ANCOUNT 的值在存儲過程完成時與過程執行時不同,則會生成一個266信息類錯誤。該錯誤不是由觸發器中同一個條件生成的。當調用存儲過程時,如果TRANCOUNT 為1或更大,并且該過程執行ROLLBACK TRANSACTION 或 ROLLBACK WORK 語句,則會產生 266 號錯誤。這是 因為ROLLBACK 回滾所有未完成的事務,并將 TRANCOUNT 減到0,該值比調用 過程時要小。如果在觸發器中發出 ROLLBACK TRANSACTION :對當前事務中的那一點所做的所有數據修改都將回滾,包括觸發器所做的修改。觸發器繼續執行 ROLLBACK 語句之后的所有其余語句。如果
12、這些語句中的任意語句修改數據,則不回滾這些修改。執行其余的語句不會激發嵌套觸發器。在批處理中,所有位于激發觸發器的語句之后的語句都不被執行。觸發器中的 ROLLBACK關閉并釋放所有在包含激發觸發器的語句的批處理中聲明和 打開的游標。這其中包括了在激發觸發器的批處理所調用的存儲過程中聲明和打開的游標。 在激發觸發器 的批處理之前的批處理中所聲明的游標將只是關閉,但是在以下條件下,STATIC或INSENSITIVE 游標不關閉:CURSOR_CLOSE_ON_COMMIT 設置為 OFF。靜態游標要么是同步游標,要么是完全填充的異步游標。當執行觸發器時,觸發器的操作總是好像有一個未完成的事務在
13、起作用。如果激發觸BEGIN TRANSACTION 語發器的語句是在隱性或顯式事務中,則肯定會這樣。在自動提交模式下,也是如此。當語 句開始以自動提交模式執行時,如果遇到錯誤,則會有隱含的語句。因為 BEGIN TRANSACTION啟動一個嵌套事務,而隨后的COMMIT 語句只應用語句完成時,該事務要么提交,要么回滾。但是,當調用觸發器時,該隱含的事務將仍然有效。這意味著,只要觸發器中發出BEGIN TRANSACTION語句,則實際上就開始了一個嵌套事務。因為當回滾嵌套事務時,嵌套的BEGIN TRANSACTION語句將被忽略,觸發器中發出的 ROLLBACK TRANSACTION總
14、是回滾過去該觸發器本身發出的所有BEGINTRANSACTION 語句。ROLLBACK 回滾到最外部的 BEGIN TRANSACTION 。若要在觸發器中進行部分回滾,則即使總是以自動提交模式進行調用,也必須使用SAVE TRANSACTION語句。以下的觸發器闡明了這一點:CREATE TRIGGER TestTrig ON TestTab FOR UPDATE ASSAVE TRANSACTION MyNameINSERT INTO TestAuditSELECT * FROM in sertedIF (error <> 0)BEGINROLLBACK TRANSACTIO
15、N MyNameEND這也影響觸發器中BEGIN TRANSACTION語句后面的 COMMIT TRANSACTION于該嵌套事務。如果在COMMIT 之后執行 ROLLBACK TRANSACTION 語句,那么ROLLBACK 將一直回滾到最外部的BEGIN TRANSACTION 。以下的觸發器闡明了這一占:八、CREATE TRIGGER TestTrig ON TestTab FOR UPDATE ASBEGIN TRANSACTIONINSERT INTO TrigTargetSELECT * FROM in sertedCOMMIT TRANSACTIONROLLBACK TR
16、ANSACTION此觸發器絕對不會在 TrigTarget表中插入。BEGIN TRANSACTION 總是啟動一個 嵌套事務。COMMIT TRANSACTION只提交嵌套事務,而下面的ROLLBACKTRANSACTION 則一直回滾到最外部的BEGIN TRANSACTION 。四、嵌套事務相關SQL語句:ROLLBACK 可以回滾某個事務保存點 (SAVE TRAN TranSavel), 女口 ROLLBACK TRANTranSavel,但是要明白的是,回滾事務保存點并不會使事務數TranCount減少,你嵌套了幾個事務,它還是有幾個事務數特別注意,如果在父存儲過程創建一個事務Tr
17、ani,然后在子存儲過程執行 ROLLBACKTRAN后,子存儲過程會拋出異常!事務只能在同一個存儲過程里面創建、回滾和提交,不允許分離在不同的存儲過程里面。基 于以上特點,我個人覺得嵌套事務的作用不大,SQL的內部處理其實最終就是處理一個最外層的事務點。SQL拋出事務相關的異常,并不是代碼有何問題,而是在提醒我們注意事務的控制。我們只要采用TRY CATCH 方式捕獲相關異常就可以,我們只要確保設計的 事務點能正常回滾或提交就 0K 了。解決方法1 :TRY CATCH 捕獲相關異常解決方法2:如果外部已經有事務了,就不再創建內部事務。我想SQL的事務異常提醒就是為了告訴你,不能隨便一個地方
18、放事務。IF TRANCOUNT =0BEGIN TRANTRY CATCH 注意事項:SQL語句不加try catch,即使出現異常,后續的SQL語句也會執行。但是一旦外部加了 try catch,則會捕獲異常,導致后續的SQL語句沒有執行。是否SQL的異常有分致命和普遍的,在沒加 try catch的情況下,普通的可以繼續往下走, 但是致命的就不往下走了。這個和C#編程語言有重大的不同,編程語言一旦出現異常,后續代碼就不再執行!在處理嵌套事務時,要特別注意,不論如何要確保事務被完整的關閉或被回滾!回滾比較好控制。無論有多少級事務數,只要ROLLBACK 一次就可以。不過如果是ROLLBACK TRAN TRANNAME ,Tran Name不是第一級的話,則會出現異常,等于沒有 執行ROLLBACK操作。提交就要特別注意了。 BEGIN TRAN 創建事務3個,則必須 COMMIT TRAN 提交事務3 次,才能確保事務數被完整提交。可以通過TRANCOUNT 來查看當前事務數。一旦存儲過程沒有完整提交事務,則可能出現事務鎖表的情況!如果創建事務的進程銷毀了,即使有未提交的事務,應該也銷毀,算回滾了吧?BEGIN TRANSAVE TRANCOMMIT TRANROLLBACK TRAN嵌套事務示例: BEGINTRAN Tran 1BEGIN TRAN Tran 2COM
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 六一創新活動方案
- 六一商場開業活動方案
- 六一廣告活動方案
- 六一活動做餃子活動方案
- 六一活動吃喝玩樂活動方案
- 六一活動捉小雞活動方案
- 六一活動美容活動方案
- 六一烹飪活動方案
- 六一舞蹈趣味活動方案
- 六一趣味撈魚活動方案
- 5.2做自強不息的中國人(教學設計)2024-2025學年七年級道德與法治下冊(統編版2024)
- 2025 年中職高考對口升學(幼兒教育學)真題試卷附參考答案
- 2025承諾合同(個人承諾)
- 2025-2030中國智能視頻行業調研分析及發展趨勢預測研究報告
- 安徽省2024-2025學年八年級信息技術水平會考操作題
- 墓地征用協議書范本
- 2025年農藝工(高級)職業技能鑒定參考試題庫(含答案)
- 臨床氣管插管拔管后吞咽障礙評估與干預實踐應用
- 海南海虹化纖工業有限公司地塊第二階段土壤污染狀況調查報告
- 堅持教育優先發展
- 外研版三年級下冊英語全冊單元測試卷(含期中期末試卷及聽力音頻)
評論
0/150
提交評論