成人午夜激情影院,小视频免费在线观看,国产精品夜夜嗨,欧美日韩精品一区二区在线播放

SQL Server如何得詳細(xì)錯(cuò)誤處理信息

2010-08-28 10:50:09來源:西部e網(wǎng)作者:

  在最近的一篇文章中,我講過如何在SQL Server2000中發(fā)現(xiàn)問題。在SQL Server 2005中處理錯(cuò)誤,最重要的因素是@@ERROR變量。每個(gè)語句執(zhí)行以后,你必須查詢這個(gè)變量值,以保證沒有使事務(wù)回滾的錯(cuò)誤發(fā)生。這種方法有些麻煩,更重要的是,還容易出錯(cuò)。另外,在SQL Server 2000中能夠處理的錯(cuò)誤類型僅限于某些類型的錯(cuò)誤。終止事務(wù)或批處理的錯(cuò)誤就無法處理,也沒有詳細(xì)的錯(cuò)誤信息。

  TRYCATCH

  SQL Server 2005提供TRYCATCH結(jié)構(gòu),它出現(xiàn)在許多現(xiàn)代迭代程序語言之中,如Java和C#中。此結(jié)構(gòu)讓你通過CATCH結(jié)構(gòu)中的一系列新函數(shù)訪問更為詳細(xì)的錯(cuò)誤信息,這些函數(shù)包括:

  ERROR_NUMBER:返回錯(cuò)誤號(hào)碼,與@@ERROR的值相同。

  ERROR_SEVERITY:返回調(diào)用CATCH塊錯(cuò)誤的嚴(yán)重程度。

  ERROR_STATE:返回錯(cuò)誤狀態(tài)號(hào)碼。

  ERROR_LINE:返回錯(cuò)誤發(fā)生的行號(hào)。

  ERROR_PROCEDURE:返回促使錯(cuò)誤發(fā)生的存儲(chǔ)程序和觸發(fā)器的名稱。

  ERROR_MESSAGE:返回錯(cuò)誤的完整信息文本。

  在CATCH塊內(nèi),你可以在任何地方應(yīng)用這些函數(shù),它們將返回與發(fā)生的錯(cuò)誤有關(guān)的信息。在CATCH塊外,這些函數(shù)返回零值。

  處理死鎖錯(cuò)誤

  讓我們來看一個(gè)例子,了解如何應(yīng)用SQL Server 2005中的新錯(cuò)誤處理功能來處理死鎖情形,在SQL Server 2000的數(shù)據(jù)庫(kù)級(jí)別下,這種問題幾乎無法處理。

  計(jì)算機(jī)中存在資源競(jìng)爭(zhēng)就會(huì)發(fā)生死鎖。這種情形并非僅發(fā)生在數(shù)據(jù)庫(kù)管理系統(tǒng)中,還發(fā)生在操作系統(tǒng)或其他任何出現(xiàn)資源爭(zhēng)奪的系統(tǒng)中。當(dāng)一個(gè)進(jìn)程鎖定特定的資源,而又需要另外的資源來完成任務(wù)時(shí),就會(huì)發(fā)生死鎖。如果另一個(gè)進(jìn)程鎖定了第一個(gè)進(jìn)程需要的資源,而且還需要第一個(gè)進(jìn)程獲得的資源,就會(huì)出現(xiàn)僵局。兩個(gè)進(jìn)程都不愿釋放自己的資源,意味著兩個(gè)進(jìn)程都不能完成自己的任務(wù)。

  不過,SQL Serve中本身就存在一個(gè)運(yùn)算法則,在這種情形下,它會(huì)隨機(jī)選擇一個(gè)失敗者,這個(gè)失敗者釋放自己的資源以便另一個(gè)進(jìn)程能夠完成自己的任務(wù)。這就意味著那個(gè)被終止的進(jìn)程必須再次嘗試。在SQL Server 2000及更早的版本中,解決這種情形的最佳方法是在業(yè)務(wù)層專門針對(duì)死鎖編寫代碼,如果探測(cè)到死鎖情況,就再次嘗試事務(wù)。隨著時(shí)間的推移,如果你注意到死鎖情形發(fā)生的趨勢(shì),你就可以在存儲(chǔ)程序中包括邏輯,設(shè)定死鎖的優(yōu)先權(quán)。這種方法允許你在死鎖情形下選擇失敗者,但你無法再次嘗試被終止的進(jìn)程。

  用SQL Server 2005,你能夠在數(shù)據(jù)層發(fā)現(xiàn)錯(cuò)誤,這樣業(yè)務(wù)層開發(fā)人員就不必?fù)?dān)心事務(wù)再次嘗試問題。如果你能夠發(fā)現(xiàn)一個(gè)死鎖錯(cuò)誤,你就需要再次嘗試語句(可能要在一段時(shí)間之后,以便釋放所需的資源)。

  為說明這些新功能的運(yùn)作情況,查看列表A。表中的代碼用來記錄發(fā)生的錯(cuò)誤。我希望記錄錯(cuò)誤處理函數(shù)的所有信息,以及錯(cuò)誤發(fā)生的日期和發(fā)生錯(cuò)誤的數(shù)據(jù)庫(kù)。

  我將用列表B中的代碼來記錄程序中發(fā)生的所有錯(cuò)誤。注意你不必給程序設(shè)定任何參數(shù),此程序?qū)⒃L問上面描述的錯(cuò)誤處理函數(shù)。這是因?yàn)樵趫?zhí)行CATCH塊的時(shí)候,你可以調(diào)用這個(gè)程序。即使調(diào)用了其他程序,你也可以在CATCH塊的任何地方參考這些函數(shù)。

  列表C專門用來查檢死鎖錯(cuò)誤號(hào),此時(shí)為1205。如果FicticiousTable1更新時(shí)發(fā)生死鎖錯(cuò)誤,語句即被重試三次。如果重試三次后還不能成功更新,就停止更新此表。

  SQL Server 2005錯(cuò)誤處理的優(yōu)點(diǎn)

  與之前的版本相比,SQL Server 2005提供了一種更為穩(wěn)健的錯(cuò)誤處理工具。在SQL Server 2000數(shù)據(jù)庫(kù)層幾乎無法處理的死鎖問題,現(xiàn)在也能輕松解決。利用這些新功能,你能夠?qū)⒏嗑Ψ旁贗T商業(yè)策略開發(fā)上,不用過于關(guān)注錯(cuò)誤處理。

關(guān)鍵詞:SQLServer

贊助商鏈接:

主站蜘蛛池模板: 衡山县| 宜州市| 正安县| 武隆县| 阳江市| 齐河县| 秦安县| 延津县| 靖宇县| 廊坊市| 旺苍县| 侯马市| 陆河县| 调兵山市| 丹寨县| 崇礼县| 叙永县| 棋牌| 右玉县| 安仁县| 婺源县| 陆良县| 巩义市| 宾阳县| 锦屏县| 林西县| 松滋市| 贵州省| 定远县| 河东区| 武义县| 吉木乃县| 佛冈县| 五常市| 沧源| 怀柔区| 长垣县| 登封市| 顺平县| 左云县| 江孜县|