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

您好,歡迎來到思海網絡,我們將竭誠為您提供優質的服務! 誠征網絡推廣 | 網站備案 | 幫助中心 | 軟件下載 | 購買流程 | 付款方式 | 聯系我們 [ 會員登錄/注冊 ]
促銷推廣
客服中心
業務咨詢
有事點擊這里…  531199185
有事點擊這里…  61352289
點擊這里給我發消息  81721488
有事點擊這里…  376585780
有事點擊這里…  872642803
有事點擊這里…  459248018
有事點擊這里…  61352288
有事點擊這里…  380791050
技術支持
有事點擊這里…  714236853
有事點擊這里…  719304487
有事點擊這里…  1208894568
有事點擊這里…  61352289
在線客服
有事點擊這里…  531199185
有事點擊這里…  61352288
有事點擊這里…  983054746
有事點擊這里…  893984210
當前位置:首頁 >> 技術文章 >> 文章瀏覽
技術文章

在SQL Server 2005中解決死鎖

添加時間:2014-10-23 1:53:27  添加: 思海網絡 

數據庫操作的死鎖是不可避免的,本文并不打算討論死鎖如何產生,重點在于解決死鎖,通過SQL Server 2005, 現在似乎有了一種新的解決辦法。

將下面的SQL語句放在兩個不同的連接里面,并且在5秒內同時執行,將會發生死鎖。


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對付死鎖的辦法是犧牲掉其中的一個,拋出異常,并且回滾事務。在SQL Server 2000,語句一旦發生異常,T-SQL將不會繼續運行,上面被犧牲的連接中, print 'end tran'語句將不會被運行,所以我們很難在SQL Server 2000的T-SQL中對死鎖進行進一步的處理。

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

下面利用的try ... catch來解決死鎖。


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 
解決方法當然就是重試,但捕獲錯誤是前提。rollback后面的waitfor不可少,發生沖突后需要等待一段時間,@retry數目可以調整以應付不同的要求。

但是現在又面臨一個新的問題: 錯誤被掩蓋了,一但問題發生并且超過3次,異常卻不會被拋出。SQL Server 2005 有一個RaiseError語句,可以拋出異常,但卻不能直接拋出原來的異常,所以需要重新定義發生的錯誤,現在,解決方案變成了這樣:


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 
我希望將來SQL Server 2005能夠直接拋出原有異常,比如提供一個無參數的RaiseError。

因此方案有點臃腫,但將死鎖問題封裝到T-SQL中有助于明確職責,提高高層系統的清晰度,F在,對于DataAccess的代碼,或許再也不需要考慮死鎖問題了。

關鍵字:Server、數據庫、死鎖

分享到:

頂部 】 【 關閉
版權所有:佛山思海電腦網絡有限公司 ©1998-2024 All Rights Reserved.
聯系電話:(0757)22630313、22633833
中華人民共和國增值電信業務經營許可證: 粵B1.B2-20030321 備案號:粵B2-20030321-1
網站公安備案編號:44060602000007 交互式欄目專項備案編號:200303DD003  
察察 工商 網安 舉報有獎  警警  手機打開網站