亚洲韩日午夜视频,欧美日韩在线精品一区二区三区,韩国超清无码一区二区三区,亚洲国产成人影院播放,久草新在线,在线看片AV色

您好,歡迎來(lái)到思海網(wǎng)絡(luò),我們將竭誠(chéng)為您提供優(yōu)質(zhì)的服務(wù)! 誠(chéng)征網(wǎng)絡(luò)推廣 | 網(wǎng)站備案 | 幫助中心 | 軟件下載 | 購(gòu)買流程 | 付款方式 | 聯(lián)系我們 [ 會(huì)員登錄/注冊(cè) ]
促銷推廣
客服中心
業(yè)務(wù)咨詢
有事點(diǎn)擊這里…  531199185
有事點(diǎn)擊這里…  61352289
點(diǎn)擊這里給我發(fā)消息  81721488
有事點(diǎn)擊這里…  376585780
有事點(diǎn)擊這里…  872642803
有事點(diǎn)擊這里…  459248018
有事點(diǎn)擊這里…  61352288
有事點(diǎn)擊這里…  380791050
技術(shù)支持
有事點(diǎn)擊這里…  714236853
有事點(diǎn)擊這里…  719304487
有事點(diǎn)擊這里…  1208894568
有事點(diǎn)擊這里…  61352289
在線客服
有事點(diǎn)擊這里…  531199185
有事點(diǎn)擊這里…  61352288
有事點(diǎn)擊這里…  983054746
有事點(diǎn)擊這里…  893984210
當(dāng)前位置:首頁(yè) >> 技術(shù)文章 >> 文章瀏覽
技術(shù)文章

在SQL Server 2005中解決死鎖

添加時(shí)間:2014-10-23 1:53:27  添加: 思海網(wǎng)絡(luò) 

數(shù)據(jù)庫(kù)操作的死鎖是不可避免的,本文并不打算討論死鎖如何產(chǎn)生,重點(diǎn)在于解決死鎖,通過(guò)SQL Server 2005, 現(xiàn)在似乎有了一種新的解決辦法。

將下面的SQL語(yǔ)句放在兩個(gè)不同的連接里面,并且在5秒內(nèi)同時(shí)執(zhí)行,將會(huì)發(fā)生死鎖。


use Northwind

begin tran 
    insert into Orders(CustomerId) values('ALFKI') 
    waitfor delay '00:00:05' 
    select * from Orders where CustomerId = 'ALFKI' 
commit 
print 'end tran' 
SQL Server對(duì)付死鎖的辦法是犧牲掉其中的一個(gè),拋出異常,并且回滾事務(wù)。在SQL Server 2000,語(yǔ)句一旦發(fā)生異常,T-SQL將不會(huì)繼續(xù)運(yùn)行,上面被犧牲的連接中, print 'end tran'語(yǔ)句將不會(huì)被運(yùn)行,所以我們很難在SQL Server 2000的T-SQL中對(duì)死鎖進(jìn)行進(jìn)一步的處理。

現(xiàn)在不同了,SQL Server 2005可以在T-SQL中對(duì)異常進(jìn)行捕獲,這樣就給我們提供了一條處理死鎖的途徑:

下面利用的try ... catch來(lái)解決死鎖。


SET XACT_ABORT ON

declare @r int 
set @r = 1 
while @r <= 3 
begin 
    begin tran 
     
    begin try        
        insert into Orders(CustomerId) values('ALFKI') 
        waitfor delay '00:00:05' 
        select * from Orders where CustomerId = 'ALFKI' 
         
        commit 
        break 
    end try 
         
    begin catch 
        rollback 
        waitfor delay '00:00:03' 
        set @r = @r + 1 
        continue 
    end catch 
end 
解決方法當(dāng)然就是重試,但捕獲錯(cuò)誤是前提。rollback后面的waitfor不可少,發(fā)生沖突后需要等待一段時(shí)間,@retry數(shù)目可以調(diào)整以應(yīng)付不同的要求。

但是現(xiàn)在又面臨一個(gè)新的問(wèn)題: 錯(cuò)誤被掩蓋了,一但問(wèn)題發(fā)生并且超過(guò)3次,異常卻不會(huì)被拋出。SQL Server 2005 有一個(gè)RaiseError語(yǔ)句,可以拋出異常,但卻不能直接拋出原來(lái)的異常,所以需要重新定義發(fā)生的錯(cuò)誤,現(xiàn)在,解決方案變成了這樣:


declare @r int 
set @r = 1 
while @r <= 3 
begin 
    begin tran 
     
    begin try        
        insert into Orders(CustomerId) values('ALFKI') 
        waitfor delay '00:00:05' 
        select * from Orders where CustomerId = 'ALFKI' 
         
        commit 
        break 
    end try 
         
    begin catch 
        rollback 
        waitfor delay '00:00:03' 
        set @r = @r + 1 
        continue 
    end catch 
end

if ERROR_NUMBER() <> 0 
begin 
    declare @ErrorMessage nvarchar(4000); 
    declare @ErrorSeverity int; 
    declare @ErrorState int;

    select  
        @ErrorMessage = ERROR_MESSAGE(), 
        @ErrorSeverity = ERROR_SEVERITY(), 
        @ErrorState = ERROR_STATE();

    raiserror (@ErrorMessage, 
               @ErrorSeverity, 
               @ErrorState 
               ); 
end 
我希望將來(lái)SQL Server 2005能夠直接拋出原有異常,比如提供一個(gè)無(wú)參數(shù)的RaiseError。

因此方案有點(diǎn)臃腫,但將死鎖問(wèn)題封裝到T-SQL中有助于明確職責(zé),提高高層系統(tǒng)的清晰度。現(xiàn)在,對(duì)于DataAccess的代碼,或許再也不需要考慮死鎖問(wèn)題了。

關(guān)鍵字:Server、數(shù)據(jù)庫(kù)、死鎖

分享到:

頂部 】 【 關(guān)閉
版權(quán)所有:佛山思海電腦網(wǎng)絡(luò)有限公司 ©1998-2024 All Rights Reserved.
聯(lián)系電話:(0757)22630313、22633833
中華人民共和國(guó)增值電信業(yè)務(wù)經(jīng)營(yíng)許可證: 粵B1.B2-20030321 備案號(hào):粵B2-20030321-1
網(wǎng)站公安備案編號(hào):44060602000007 交互式欄目專項(xiàng)備案編號(hào):200303DD003  
察察 工商 網(wǎng)安 舉報(bào)有獎(jiǎng)  警警  手機(jī)打開(kāi)網(wǎng)站