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