您好,登錄后才能下訂單哦!
這篇文章主要介紹“SQLServer在存儲過程中編寫事務處理代碼的方法有哪些”,在日常操作中,相信很多人在SQLServer在存儲過程中編寫事務處理代碼的方法有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”SQLServer在存儲過程中編寫事務處理代碼的方法有哪些”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
在編寫SQLServer事務相關的存儲過程代碼時,經常看到下面這樣的寫法:
begintranupdatestatement1...updatestatement2...deletestatement3...committran
這樣編寫的SQL存在很大隱患。請看下面的例子:
createtabledemo(idintnotnull)gobegintraninsertintodemovalues(null)insertintodemovalues(2)committrango
執行時會出現一個違反notnull約束的錯誤信息,但隨后又提示(1row(s)affected)。我們執行select*fromdemo后發現insertintodemovalues(2)卻執行成功了。這是什么原因呢原來SQLServer在發生runtime錯誤時,默認會rollback引起錯誤的語句,而繼續執行后續語句。
SQLServer在存儲過程中編寫事務處理代碼有哪些方法
如何避免這樣的問題呢?有三種方法:
1.在事務語句最前面加上setxact_aborton
setxact_abortonbegintranupdatestatement1...updatestatement2...deletestatement3...committrango
當xact_abort選項為on時,SQLServer在遇到錯誤時會終止執行并rollback整個事務。
2.在每個單獨的DML語句執行后,立即判斷執行狀態,并做相應處理。
begintranupdatestatement1...if@@error<>0beginrollbacktrangotolabendenddeletestatement2...if@@error<>0beginrollbacktrangotolabendendcommittranlabend:go
3.在SQLServer2005中,可利用try...catch異常處理機制。
begintranbegintryupdatestatement1...deletestatement2...endtrybegincatchif@@trancount>0rollbacktranendcatchif@@trancount>0committrango
下面是個簡單的存儲過程,演示事務處理過程。
createproceduredbo.pr_tran_inprocasbeginsetnocountonbegintranupdatestatement1...if@@error<>0beginrollbacktranreturn-1enddeletestatement2...if@@error<>0beginrollbacktranreturn-1endcommittranreturn0endgo
到此,關于“SQLServer在存儲過程中編寫事務處理代碼的方法有哪些”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。