SQL Server 2005中解決死鎖問題

2021-09-08 07:53:03 字數 2399 閱讀 2753

資料庫操作的死鎖是不可避免的,本文並不打算討論死鎖如何產生,重點在於解決死鎖,通過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不 

解決方法當然就是重試,但捕獲錯誤是前提。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中有助於明確職責,提高高層系統的清晰度。現在,對於dataaccess的**,或許再也不需要考慮死鎖問題了。

from csdn:

sql server 2005中的output子句

今天看了下sql server 2005中的output子句,以使您可以從修改語句 insert update delete 中將資料返回到表變數中。帶結果的 dml 的有用方案包括清除和存檔 訊息處理應用程式以及其他方案。這一新的 output 子句的語法為 output into table v...

With在sql server 2005中的用法

with在msdn中的講解,可以參考鏈結 1 2 建立錶值變數型別 3 4create type ty newareagoods as table 5 areaid int notnull,6 goodsid int notnull 7 8 9 創鍵返回今天 的資料 10 根據有 的地區獲取參 11...

sql server 2005中的output子句

今天看了下sql server 2005中的output子句,以使您可以從修改語句 insert update delete 中將資料返回到表變數中。帶結果的 dml 的有用方案包括清除和存檔 訊息處理應用程式以及其他方案。這一新的 output 子句的語法為 output into table v...