亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

存儲過程中使用事物(轉)

2019-11-17 02:47:16
字體:
來源:轉載
供稿:網友

存儲過程中使用事物(轉)

一、存儲過程中使用事務的簡單語法

在存儲過程中使用事務時非常重要的,使用數據可以保持數據的關聯完整性,在Sql server存儲過程中使用事務也很簡單,用一個例子來說明它的語法格式:

復制代碼代碼Create PRocedure MyProcedure( @Param1 nvarchar(10),@param2 nvarchar(10))ASBeginSet NOCOUNT ON;Set XACT_ABORT ON;Begin TranDelete from table1 where name=’abc’;Insert into table2 values(value1,value2,value3);Commit TranEnd復制代碼

說明:1、使用存儲過程執行事物,需要開啟XACT_ABORT參數(默認值為Off),將該參數設置為On,表示當執行事務時,如果出錯,會將transcation設置為uncommittable狀態,那么在語句塊批處理結束后將回滾所有操作;如果該參數設置為Off,表示當執行事務時,如果出錯,出錯的語句將不會執行,其他正確的操作繼續執行。

2、當SET NOCOUNT 為 ON 時,不返回計數(計數表示受 Transact-SQL 語句影響的行數,例如在Sql server查詢分析器中執行一個delete操作后,下方窗口會提示(3)Rows Affected)。當 SET NOCOUNT 為 OFF 時,返回計數,我們應該在存儲過程的頭部加上SET NOCOUNT ON 這樣的話,在退出存儲過程的時候加上 SET NOCOUNT OFF這樣的話,以達到優化存儲過程的目的。

二、事務內設置保存點

  用戶可以在事務內設置保存點或標記。保存點定義如果有條件地取消事務的一部分,事務可以返回的位置。如果將事務回滾到保存點,則必須(如果需要,使用更多的 Transact-SQL 語句和 COMMIT TRANSACTION 語句)繼續完成事務,或者必須(通過將事務回滾到其起始點)完全取消事務。若要取消整個事務,請使用 ROLLBACK TRANSACTION transaction_name 格式。這將撤消事務的所有語句和過程。如:

復制代碼代碼Create Procedure MyProcedureASBeginSet NOCOUNT ON;Set XACT_ABORT ON;begin tran ok --開始一個事務OK delete from rxqz where qz= 'rx015 ' --刪除數據 save tran bcd --保存一個事務點命名為bcdupdate sz set name='李麗s' where name= '李麗'--修改數據if @@error<>0 --判斷修改數據有沒有出錯 begin --如果出錯 rollback tran bcd -- 回滾事務到BCD 的還原點commit tran ok --提交事務end else --沒有出錯commit tran ok --提交事務 End復制代碼

  說明:1、@@error判斷是否有錯誤,為0表示沒有錯誤,但是對那種重大錯誤無法捕捉,而且@@error只能前一句sql語句生效。

三、存儲過程使用try&hellip;catch捕獲錯誤

  在存儲過程中可以使用try…catch語句來捕獲錯誤,如下:

復制代碼代碼Create Procedure MyProcedure( @Param1 nvarchar(10),@param2 nvarchar(10))ASBeginSet NOCOUNT ON;Begin tryDelete from table1 where name=’abc’;Insert into table2 values(value1,value2,value3);End tryBegin CatchSELECT ERROR_NUMBER() AS ErrorNumber,ERROR_MESSAGE() AS ErrorMessage;End CatchEnd復制代碼

  說明:1、捕獲錯誤的函數有很多,如下:

ERROR_NUMBER() 返回錯誤號。

    ERROR_SEVERITY() 返回嚴重性。

    ERROR_STATE() 返回錯誤狀態號。

    ERROR_PROCEDURE() 返回出現錯誤的存儲過程或觸發器的名稱。

    ERROR_LINE() 返回導致錯誤的例程中的行號。

    ERROR_MESSAGE() 返回錯誤消息的完整文本。該文本可包括任何可替換參數所提供的值,如長度、對象名或時間。

    2、有些錯誤,如sql語句中的表名稱輸入錯誤,這是數據庫引擎無法解析這個表名稱時,所發生的錯誤在當前的try…catch語句中無法捕獲,必須由外層調用該存儲過程的地方使用             try…catch來進行捕獲。

四、存儲過程中事務和try…catch聯合使用

  在存儲過程中使用事務時,如果沒有try…catch語句,那么當set xact_abort on時,如果有錯誤發生,在批處理語句結束后,系統會自動回滾所有的sql操作。當set xact_abort off時,如果有錯誤發生,在批處理語句結束后,系統會執行所有沒有發生錯誤的語句,發生錯誤的語句將不會被執行。

在存儲過程中使用事務時,如果存在try…catch語句塊,那么當捕獲到錯誤時,需要在catch語句塊中手動進行Rollback操作,否則系統會給客戶端傳遞一條錯誤信息。如果在存儲過程開始處將set xact_abort on,那么當有錯誤發生時,系統會將當前事務置為不可提交狀態,即會將xact_state()置為-1,此時只可以對事務進行Rollback操作,不可進行提交(commit)操作,那么我們在catch語句塊中就可以根據xact_state()的值來判斷是否有事務處于不可提交狀態,如果有則可以進行rollback操作了。如果在存儲過程開始處將set xact_abort off,那么當有錯誤發生時,系統不會講xact_state()置為-1,那么我們在catch塊中就不可以根據該函數值來判斷是否需要進行rollback了,但是我們可以根據@@Trancount全局變量來判斷,如果在catch塊中判斷出@@Trancount數值大于0,代表還有未提交的事務,既然進入catch語句塊了,那么還存在未提交的事務,該事務應該是需要rollback的,但是這種方法在某些情況下可能判斷的不準確。推薦的方法還是將set xact_abort on,然后在catch中判斷xact_state()的值來判斷是否需要Rollback操作。

下面我們來看看兩個例子:

一.使用Set xact_abort on

復制代碼代碼Create proc myProcedureAsbeginset xact_abort on;begin trybegin traninsert into TestStu values('Terry','boy',23);insert into TestStu values('Mary','girl',21);commit tranend trybegin catch--在此可以使用xact_state()來判斷是否有不可提交的事務,不可提交的事務--表示在事務內部發生錯誤了。Xact_state()有三種值:-1.事務不可提交;--1.事務可提交;0.表示沒有事務,此時commit或者rollback會報錯。if xact_state()=-1rollback tran;end catchend復制代碼

二.使用Set xact_abort off

復制代碼代碼Create proc myProcedureAsbeginset xact_abort off;begin trybegin traninsert into TestStu values('Terry','boy',23);insert into TestStu values('Mary','girl',21);commit tranend trybegin catch--在此不可以使用xact_state來判斷是否有不可提交的事務--只可以使用@@Trancount來判斷是否有還未提交的事務,未提交的事務未必--就是不可提交的事務,所以使用@@TranCount>0后就RollBack是不準確的if @@TranCount>0rollback tran;end catchend復制代碼

另外,對于@@Trancount需要說明的是,begin tran 語句將 @@Trancount加 1。Rollback tran將 @@Trancount遞減到 0,但 Rollback tran savepoint_name 除外,它不影響 @@Trancount。Commit tran 或 Commit work 將 @@Trancount 遞減 1。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品爽爽爽| 国产精品热视频| 精品中文字幕乱| 亚洲精品成人免费| 亚洲精品国产精品国产自| 97在线视频免费看| 国产色视频一区| 亚洲国产一区二区三区在线观看| 欧美激情网友自拍| 岛国av午夜精品| 亚洲经典中文字幕| 欧美激情视频在线免费观看 欧美视频免费一| 欧美性高跟鞋xxxxhd| 国产精品视频yy9099| 精品国产一区二区三区在线观看| 亚洲伊人久久综合| 亚洲精品一区二区在线| 成人羞羞国产免费| 亚洲天堂第二页| 国产精品久久久久久久午夜| 最近2019中文字幕大全第二页| 欧日韩在线观看| 亚洲精品白浆高清久久久久久| 亚洲第五色综合网| 国产精品成人av性教育| 国产91|九色| 51久久精品夜色国产麻豆| 亚洲欧美日韩区| 国产精品久久久久7777婷婷| 国产裸体写真av一区二区| 亚洲欧美制服综合另类| 欧美性猛交xxxx免费看漫画| 久久久久久久久中文字幕| 久久黄色av网站| 精品亚洲精品福利线在观看| 久久精品久久精品亚洲人| 国产欧美日韩综合精品| 国语自产在线不卡| 国产精品av在线播放| 91久久精品久久国产性色也91| 欧美电影免费观看电视剧大全| 亚洲电影免费观看高清完整版在线观看| 国产精品wwwwww| 欧美电影免费观看高清| 亚洲欧美另类自拍| 日韩av一区在线观看| 欧美最猛性xxxxx(亚洲精品)| 美女啪啪无遮挡免费久久网站| 久久久精品电影| 孩xxxx性bbbb欧美| 日韩av网址在线观看| 日日骚av一区| 91久久国产综合久久91精品网站| 亚洲国产精品成人va在线观看| 欧美日韩电影在线观看| 欧美黑人xxx| 久久久久久久激情视频| 国产综合在线看| 成人黄色免费片| 激情成人中文字幕| 7777精品久久久久久| 日韩精品视频中文在线观看| 欧美又大粗又爽又黄大片视频| 日韩免费观看网站| 搡老女人一区二区三区视频tv| 国产成人av网| 精品久久久久久久久久久久| 国产精品欧美久久久| 国产v综合v亚洲欧美久久| 日韩在线视频网| 欧美性感美女h网站在线观看免费| 国产成人一区二区在线| 国产日韩中文字幕| 尤物精品国产第一福利三区| 久久不射热爱视频精品| 91精品国产高清| 久久久国产一区二区三区| 亚洲国产精品999| 超碰97人人做人人爱少妇| 欧美影院久久久| 亚洲精品之草原avav久久| 日韩福利视频在线观看| xx视频.9999.com| 欧美黑人巨大xxx极品| 一区国产精品视频| 欧美精品videos| 国产精品高潮粉嫩av| 日本久久精品视频| 久久国产加勒比精品无码| 欧美日韩成人网| 欧美在线观看一区二区三区| 日韩在线免费视频| 日韩欧美黄色动漫| 国产午夜精品全部视频播放| 日韩国产欧美精品一区二区三区| 日韩av在线直播| 久久久久国色av免费观看性色| 国产精品国模在线| 狠狠色狠狠色综合日日五| 久热99视频在线观看| 中文字幕av一区中文字幕天堂| 韩剧1988在线观看免费完整版| 亚洲精品日韩丝袜精品| 欧美国产日产韩国视频| 欧美大片免费观看在线观看网站推荐| 国产噜噜噜噜久久久久久久久| 午夜精品久久久久久久99热| 亚洲色图综合久久| 在线观看欧美视频| 日韩av网站电影| 日本精品免费一区二区三区| 国产精品福利在线| 欧美福利视频在线观看| 欧美人在线视频| 97视频在线看| 欧美大片在线免费观看| 萌白酱国产一区二区| 国产日产亚洲精品| 日韩视频第一页| 97香蕉久久夜色精品国产| 国产欧美精品xxxx另类| 欧美一区二区三区免费视| 国产一区二区视频在线观看| 国产欧美最新羞羞视频在线观看| 欧美黑人一级爽快片淫片高清| 正在播放亚洲1区| 伊人久久久久久久久久| 亚洲国产日韩欧美在线动漫| 久久精品国产69国产精品亚洲| 2025国产精品视频| 日韩在线免费高清视频| 91中文精品字幕在线视频| 亚洲精品一区久久久久久| 成人国产在线激情| 久久精品视频免费播放| 国产精品久久久久福利| 国内精品模特av私拍在线观看| 91在线免费视频| 亚洲美女激情视频| 国产精品 欧美在线| 性欧美xxxx交| 久久精品国产清自在天天线| 欧美另类在线观看| 51久久精品夜色国产麻豆| 久久av在线播放| 欧美午夜性色大片在线观看| 精品久久久久久久久久国产| 亚洲欧洲av一区二区| 欧美激情综合亚洲一二区| 波霸ol色综合久久| 欧美巨乳美女视频| 91精品国产91久久久久久| 欧美日韩激情视频8区| 欧美视频在线免费看| 性色av一区二区三区在线观看| 精品久久久久久久久久久久久久| 国内精品模特av私拍在线观看| 欧美性xxxx极品hd满灌| 红桃视频成人在线观看| 中文字幕亚洲欧美日韩高清| 亚洲天堂男人的天堂| 91精品免费看| 久久久亚洲精品视频| 久久久久久国产精品|