老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業提供網站建設、域名注冊、服務器等服務

sql中怎么使用TRY/CATCH語句避免死鎖

這篇文章主要為大家展示了“sql中怎么使用TRY/CATCH語句避免死鎖”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“sql中怎么使用TRY/CATCH語句避免死鎖”這篇文章吧。

創新互聯公司-專業網站定制、快速模板網站建設、高性價比江城網站開發、企業建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式江城網站制作公司更省心,省錢,快速模板網站建設找我們,業務覆蓋江城地區。費用合理售后完善,10余年實體公司更值得信賴。

死鎖是正常現象不可避免。發生死鎖會犧牲一個進程并回滾事務,SQL不會自己重試,需要用TRY/CATCH和WAITFOR實現重試。具體方法如下
如何使用 TRY/CATCH 語句避免死鎖
現在,讓我們來使用 TRY/CATCH 語句修改代碼正文。(對于本示例,需要以 SQL Server 2005 版本運行代碼。)使用 TRY/CATCH 時,操作代碼和錯誤處理代碼是分開的。您應該將執行一個操作的代碼放在 TRY 語句塊中,將錯誤處理代碼放在 CATCH 語句塊中。如果 TRY 語句塊中的代碼執行失敗,代碼執行將跳到 CATCH 語句塊。(除了那些防礙整個批處理運行的錯誤(如,丟失對象),該方法幾乎適用于所有的錯誤。)

以下示例使用 TRY/CATCH 語句對前面使用的代碼進行了改寫。代碼標題相同,但是代碼正文不同:

BEGIN TRANSACTION
BEGIN TRY
  INSERT Authors VALUES
  (@au_id, @au_lname, '', '', '', '', '', '11111', 0)
  WAITFOR DELAY '00:00:05'
  SELECT COUNT(*)  FROM Authors
  COMMIT
END TRY
BEGIN CATCH
  SELECT ERROR_NUMBER() AS ErrorNumber
  ROLLBACK
END CATCH;
SELECT @@TRANCOUNT AS '@@Trancount'
現在,在連接到 SQL Server 2005 的并列窗口中運行這些代碼,在此之前您需要確認已經刪除了 authors 表格中任何可能阻止插入操作的數據;或者,您可以使用前置 DELETE 語句。

兩個窗口返回的 @@TRANCOUNT 級別都為 0,這表明仍然發生了死鎖,但 TRY/CATCH 語句捕獲了這次發生的死鎖。死鎖犧牲品的批處理沒有再次中止,可在它的輸出結果中看到錯誤:

ErrorNumber
-----------
1205
@@Trancount
-----------
0
您應該已經發現 TRY/CATCH 語句具有的威力了。因為死鎖錯誤能夠為 CATCH 語句塊所捕獲,所以批處理將不再中止,T-SQL 代碼也能繼續執行。對于死鎖犧牲品而言,死鎖錯誤 1205 將代碼放入 CATCH 語句塊 — 在這里您可以使用新的錯誤處理函數瀏覽死鎖錯誤。前置代碼僅使用 ERROR_NUMBER() 函數取代 @@ERROR 變量,您也可以使用 ERROR_MESSAGE()、 ERROR_PROCEDURE()、ERROR_SEVERITY() 和 ERROR_STATE()。這些函數的功能一目了然,它們提供的功能比我們以往使用的更多。

請注意,這個前置 CATCH 語句塊包含一個 ROLLBACK。這樣做的原因是,即使捕獲了死鎖錯誤,事務也不會回滾。事務仍然要失敗,但是,現在您有責任在 TRY/CATCH 語句中回滾事務。那么,區別在哪里?盡管您不能使事務繼續進行,但是您能夠重試事務!

在 TRY/CATCH 語句中進行重試

在 SQL Server 2000 的 T-SQL 中,錯誤 1205 令人沮喪之處是它提供的建議:“Rerun the transaction.”問題是,至少在 SQL Server 2000 的 T-SQL 中,您不能做到這一點。但是,由于 SQL Server 2005 的 TRY/CATCH 為我們提供了捕獲死鎖錯誤的方法,現在,重試事務是可能實現的。

以下代碼正文說明了一種執行重試操作的方法。這段代碼仍然使用與前面相同的標題:

DECLARE @Tries tinyint
SET @Tries = 1
WHILE @Tries <= 3
BEGIN
  BEGIN TRANSACTION
  BEGIN TRY
    INSERT Authors VALUES
      (@au_id, @au_lname, '', '', '', '', '', '11111', 0)
    WAITFOR DELAY '00:00:05'
    SELECT * FROM authors WHERE au_lname LIKE 'Test%'
    COMMIT
    BREAK
  END TRY
  BEGIN CATCH
    SELECT ERROR_NUMBER() AS ErrorNumber
    ROLLBACK
    SET @Tries = @Tries + 1
    CONTINUE
  END CATCH;
END
這段代碼的功能是通過一個 WHILE 循環添加一個重試操作。我將重試次數設置為 3,重試次數是可以配置的。至少我們現在有了一種在 T-SQL 內重試一個死鎖犧牲品代碼的方法 — 這是我們過去一直無法做到的。

但是,需要注意整個事務是在 WHILE 循環內進行的 — 而不是在循環外部。因此執行循環時,事務不僅在每個循環體內部開始,而且也在其中結束 — 不是 TRY 語句塊執行完畢,返回一個 COMMIT,就是 CATCH 語句塊執行,返回一個 ROLLBACK。如果 TRY 成功,TRY 語句塊將以一個 BREAK 語句結束,退出 WHILE 循環。否則,CATCH 語句塊將重試計數器加 1,以一個 CONTINUE 語句結束本次循環,重新執行下次 WHILE 循環。事實上,您有實現重試事務的代碼 — 就像錯誤 1205 告訴我們做的那樣。但現在,重試操作完全在 T-SQL 內部完成。

sql Server 2005 也提供幫助解決死鎖問題的其他方法,例如 SNAPSHOT ISOLATION 級別和用于 READ COMMITTED 的新選項(稱為 READ COMMITTED SNAPSHOT)。然而,這一事實 — 現在,通過 SQL Server 2005,您能夠對事務進行編碼并捕獲死鎖錯誤(并重試它們) — 已經意味著您擁有一個可任意支配、功能更加強大的工具。 

以上是“sql中怎么使用TRY/CATCH語句避免死鎖”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注創新互聯行業資訊頻道!


分享文章:sql中怎么使用TRY/CATCH語句避免死鎖
文章路徑:http://www.xueling.net.cn/article/igggge.html

其他資訊

在線咨詢
服務熱線
服務熱線:028-86922220
TOP
主站蜘蛛池模板: 国产精品综合久久 | 成人高清视频免费观看 | 日韩黄色高清 | 欧美日韩偷拍一区 | 揉捏奶头高潮呻吟视频 | 99精品视频在线观看免费 | 国产91清纯白嫩初高中在线观看 | 日韩经典中文字幕 | 夜夜躁狠狠躁日日躁2024 | 亚洲国产一区二区av | 国产一区二区精彩视频 | 特黄一区二区 | 亚洲精品天天影视综合网 | 最近中文AV字幕在线中文 | 无码国产玉足脚交久久2024 | 一区二区三区 | 男女一级毛片 | 999亚洲精品无码久久久久 | 日韩色中色 | 久久午夜无码人妻鲁丝片午夜精品 | 亚洲国产aⅴ精品一区二区 可以直接看的无码AV | 久草网视频 | 伊甸园一区二区 | 日批国产| 无人区码一码二码三mba智库 | 国产精品毛片一区二区三区四区 | 久久精品国产av一区二区三区 | 成人亚洲免费 | 韩国理伦三级做爰在线播放 | 四虎影院4hu | 中文字幕人妻日本无码 | 日本美女黄网站 | 中文字幕一区在线播放 | 精品人妻无码一区二区三区打不开 | 久久成人在线 | 亚洲综合成人影院 | 国产精品51麻豆cm传媒的特点 | 国产成人免费网站在线观看 | 人妻偷人VA精品国产旡码 | 大人在线免费视频 | 91性高潮久久久久久久久 |