欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
用TRY/CATCH解決SQL2005的死鎖
 讓我們從這樣一個(gè)示例開(kāi)始說(shuō)起,它在 SQL Server 2000 和 2005 中都能引起死鎖。在本文中,我使用 SQL Server 2005 的最新 CTP(社區技術(shù)預覽,Community Technology Preview)版本,SQL Server 2005 Beta 2(7 月發(fā)布)也同樣適用。如果您沒(méi)有 Beta 2 或最新的 CTP 版本,請下載 SQL Server 2005 Express 的最新版本,用它來(lái)進(jìn)行試驗。

  可能發(fā)生的死鎖情況有很多,[參閱http://msdn.microsoft.com/library/default.asp?url=/library/en-us/acdata/ac_8_con_7a_3xrf.asp以及死鎖文章樹(shù)中的后續文章?!?編者 ],但最有趣、最微妙的是那些關(guān)于閱讀器和編寫(xiě)器互相阻塞的死鎖。以下代碼在 pubs 數據庫中就產(chǎn)生了這樣一個(gè)死鎖。(您可以在 SQL Server 2000 的兩個(gè) Query Analyzer 窗口中或 SQL Server 2005 的兩個(gè) Management Studio queries 中并列運行這段代碼。)在其中一個(gè)窗口中的代碼正文前面添加下列語(yǔ)句:

中國網(wǎng)管聯(lián)盟www_bitscn_com

 

-- Window 1 headerDECLARE @au_id varchar(11), @au_lname varchar(40)SELECT @au_id = '111-11-1111', @au_lname = 'test1'中國網(wǎng)管聯(lián)盟www_bitscn_com 

  在第二個(gè)窗口中添加下列語(yǔ)句,進(jìn)行第二次連接: 中國網(wǎng)管聯(lián)盟www_bitscn_com

-- Window 2 headerDECLARE @au_id varchar(11), @au_lname varchar(40)SELECT @au_id = '111-11-1112', @au_lname = 'test2'
網(wǎng)管網(wǎng)bitsCN.com

  在兩個(gè)窗口中都使用下列語(yǔ)句作為代碼正文: 54com.cn

-- Body for both connections:BEGIN TRANSACTIONINSERT Authors VALUES(@au_id, @au_lname, '', '', '', '', '', '11111', 0)WAITFOR DELAY '00:00:05'SELECT *FROM authorsWHERE au_lname LIKE 'Test%'COMMIT
中國網(wǎng)管聯(lián)盟www、bitsCN、com

  在第三個(gè)窗口中運行下列語(yǔ)句,確保 authors 表格中沒(méi)有任何包含以下 id 的數據:

中國網(wǎng)管聯(lián)盟www_bitscn_com

 

DELETE FROM authors WHERE au_id = '111-11-1111'DELETE FROM authors WHERE au_id = '111-11-1112'
54com.cn

  在 5 秒鐘內同時(shí)執行窗口 1 和 窗口 2。因為每個(gè)窗口都要等待至少 5 秒鐘的時(shí)間才能發(fā)出 SELECT 語(yǔ)句,所有每個(gè)連接都將完成 INSERT 操作,這樣就保證了兩個(gè)窗口中的 INSERT 操作在各自的 SELECT 語(yǔ)句發(fā)布前就已經(jīng)完成了。每個(gè)窗口中的 SELECT 語(yǔ)句都嘗試讀取 authors 表格中的所有數據,查找 au_lname 字段值中類(lèi)似“Test%”格式的數據。因此,兩個(gè)窗口中的 SELECT 語(yǔ)句都將嘗試讀取各自連接中的插入數據 — 也讀取對方連接中的插入數據。 中國網(wǎng)管聯(lián)盟www_bitscn_com

  read COMMITTED 隔離級別通過(guò)發(fā)布共享鎖確保 SELECT 語(yǔ)句永遠不讀取未提交的數據。對于同一個(gè)資源,共享鎖與排它鎖互不兼容,請求者在發(fā)布共享鎖之前必須等待排它鎖釋放。每個(gè)連接對于插入的數據都設置了排它鎖,因此嘗試讀取對方插入數據的 SELECT 語(yǔ)句將試圖解除插入數據的共享鎖,但它會(huì )被阻塞。兩個(gè)連接將互相阻塞,從而形成一個(gè)死鎖。SQL Server 的鎖定管理器檢測到死鎖時(shí),將中止其中的一個(gè)批處理,回滾它的事務(wù),釋放它的阻塞鎖,以便其他事務(wù)能夠完成。作為死鎖犧牲品的事務(wù)將回滾,其他事務(wù)則將成功完成。 網(wǎng)管網(wǎng)bitsCN_com

如何使用 TRY/CATCH 語(yǔ)句避免死鎖


  現在,讓我們來(lái)使用 TRY/CATCH 語(yǔ)句修改代碼正文。(對于本示例,需要以 SQL Server 2005 版本運行代碼。)使用 TRY/CATCH 時(shí),操作代碼和錯誤處理代碼是分開(kāi)的。您應該將執行一個(gè)操作的代碼放在 TRY 語(yǔ)句塊中,將錯誤處理代碼放在 CATCH 語(yǔ)句塊中。如果 TRY 語(yǔ)句塊中的代碼執行失敗,代碼執行將跳到 CATCH 語(yǔ)句塊。(除了那些防礙整個(gè)批處理運行的錯誤(如,丟失對象),該方法幾乎適用于所有的錯誤。)

中國網(wǎng)管聯(lián)盟www、bitsCN、com

 

  以下示例使用 TRY/CATCH 語(yǔ)句對前面使用的代碼進(jìn)行了改寫(xiě)。代碼標題相同,但是代碼正文不同:

網(wǎng)管網(wǎng)bitsCN.com

 

BEGIN TRANSACTIONBEGIN TRYINSERT Authors VALUES(@au_id, @au_lname, '', '', '', '', '', '11111', 0)WAITFOR DELAY '00:00:05'SELECT COUNT(*)  FROM AuthorsCOMMITEND TRYBEGIN CATCHSELECT ERROR_NUMBER() AS ErrorNumberROLLBACKEND CATCH;SELECT @@TRANCOUNT AS '@@Trancount'
網(wǎng)管網(wǎng)bitsCN_com

  現在,在連接到 SQL Server 2005 的并列窗口中運行這些代碼,在此之前您需要確認已經(jīng)刪除了 authors 表格中任何可能阻止插入操作的數據;或者,您可以使用前置 DELETE 語(yǔ)句。 中國網(wǎng)管論壇bbs.bitsCN.com

  兩個(gè)窗口返回的 @@TRANCOUNT 級別都為 0,這表明仍然發(fā)生了死鎖,但 TRY/CATCH 語(yǔ)句捕獲了這次發(fā)生的死鎖。死鎖犧牲品的批處理沒(méi)有再次中止,可在它的輸出結果中看到錯誤: 網(wǎng)管網(wǎng)bitsCN_com

ErrorNumber-----------1205@@Trancount-----------0
54com.cn

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

中國網(wǎng)管聯(lián)盟www、bitsCN、com

 

  請注意,這個(gè)前置 CATCH 語(yǔ)句塊包含一個(gè) ROLLBACK。這樣做的原因是,即使捕獲了死鎖錯誤,事務(wù)也不會(huì )回滾。事務(wù)仍然要失敗,但是,現在您有責任在 TRY/CATCH 語(yǔ)句中回滾事務(wù)。那么,區別在哪里?盡管您不能使事務(wù)繼續進(jìn)行,但是您能夠 重試事務(wù)! 中國網(wǎng)管聯(lián)盟www_bitscn_com

在 TRY/CATCH 語(yǔ)句中進(jìn)行重試


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

54com.cn

 

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

54com.cn

 

DECLARE @Tries tinyintSET @Tries = 1WHILE @Tries <= 3BEGINBEGIN TRANSACTIONBEGIN TRYINSERT Authors VALUES(@au_id, @au_lname, '', '', '', '', '','11111', 0)WAITFOR DELAY '00:00:05'SELECT * FROM authors WHERE au_lname LIKE 'Test%'COMMITBREAKEND TRYBEGIN CATCHSELECT ERROR_NUMBER() AS ErrorNumberROLLBACKSET @Tries = @Tries + 1CONTINUEEND CATCH;END中國網(wǎng)管聯(lián)盟www_bitscn_com 

  這段代碼的功能是通過(guò)一個(gè) WHILE 循環(huán)添加一個(gè)重試操作。我將重試次數設置為 3,重試次數是可以配置的。至少我們現在有了一種在 T-SQL 內重試一個(gè)死鎖犧牲品代碼的方法 — 這是我們過(guò)去一直無(wú)法做到的。 feedom.net

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

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

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
深入淺出 關(guān)于SQL Server中的死鎖問(wèn)題
Oracle session
30 個(gè)java編程技巧(最佳實(shí)踐的初學(xué)者)一
巧用GO將多次重復執行SQL語(yǔ)句_MSsql_中國網(wǎng)管聯(lián)盟bitsCN.com
java學(xué)習筆記---異常學(xué)習 5-30
MSSQL應用系列---NOLOCK 和ROWLOCK 的秘密
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久