導航:首頁 > 編程大全 > 如何查看資料庫死鎖

如何查看資料庫死鎖

發布時間:2023-06-03 14:58:53

資料庫中死鎖是什麼產生的

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

② DB2資料庫發生死鎖了怎麼辦

先定位一下是哪個程序句柄導致的死鎖。

方法一、查看db2diag.log文件
找到DeadLock or Lock timeout 死鎖或鎖超時信息
db2 force application(句柄ID)
直接結束進程即可。

方法二、DB2快照信息
1、看一下DB2快照信息
db2 get snapshot for locks on sample
可以得到類似信息:
資料庫鎖定快照
資料庫名稱 = SAMPLE
資料庫路徑 = D:\IBM\DB2\NODE0000\SQL00001\
輸入資料庫別名 = SAMPLE
掛起的鎖定 = 8
當前已連接的應用程序 = 2
當前正等待鎖定的代理程序數 = 1
應用程序句柄 = 54
應用程序標識 = *LOCAL.DB2.140304192925
序號 = 00001
應用程序名 = db2bp.exe CONNECT
授權標識 = DB2ADMIN
應用程序狀態 = 鎖定等待
應用程序代碼頁 = 1208
掛起的鎖定 = 4
總計等待時間(毫秒) = 247867

鎖定列表

鎖定名稱 = 0x5359534C564C3031DDECEF2841
鎖定屬性 = 0x00000000
發行版標志 = 0x40000000
鎖定計數 = 1
掛起計數 = 0
鎖定對象名 = 2312
對象類型 = 行
表空間名 = IBMDB2SAMPLEREL
表模式 = DB2ADMIN
表名 = TEST
方式 = IX

查看鎖定的詳細信息:db2 get snapshot for locks for application agentid 1728
----(1728是句柄ID)
3、觀察命令db2 list applications的輸出
查看應用程序的狀態是否有鎖定等待(Lock-wait)狀態出現。
執行命令 list applications for db sample show detail;
4、db2 force application(句柄ID)
直接結束進程即可。

閱讀全文

與如何查看資料庫死鎖相關的資料

熱點內容
怎樣獲取郵箱帳號和密碼 瀏覽:809
怎麼通過js實現回到指定頁面 瀏覽:140
如何用網路簽字 瀏覽:552
三星電視拆機教程 瀏覽:19
創維怎麼連接網路 瀏覽:868
2007版word繪圖在哪裡 瀏覽:311
可以拍車牌的app是什麼 瀏覽:508
文件加個井字型大小什麼意思 瀏覽:155
怎麼刪除多重網路 瀏覽:999
求生之路2區域網聯機工具 瀏覽:827
說明文件結尾用什麼詞 瀏覽:578
發送的文件名變數字 瀏覽:778
檔案資料庫管理 瀏覽:992
微信acl是金融傳銷嗎 瀏覽:620
企業如何通過進行網路營銷 瀏覽:551
微信json轉換錯誤 瀏覽:364
拉勾勾是什麼網站 瀏覽:556
長沙哪個學校有大數據技術與應用 瀏覽:137
qq語音停止運行 瀏覽:312
java獲取系統當前時間並轉為秒 瀏覽:679

友情鏈接