本文介紹如何通過控制臺查看RDS SQL Server數據庫中的死鎖及其詳細信息。
前提條件
實例不能是RDS SQL Server 2008 R2云盤版。
背景信息
由于事務的特殊機制,一個事務對特定資源進行修改的同時會鎖定該資源,防止其他并發事務對該資源進行修改,以達到數據一致性的目的。
死鎖(DeadLock)通常是由多個事務互相競爭資源引發的。例如,事務A在修改資源A的同時,發起了對資源B的修改,而此時事務B正在修改資源B,并且對資源A發起了修改,便會引發死鎖。如下圖所示。
死鎖會導致受害者會話(即使用成本相對較低的SQL語句的會話)被系統終止(Kill),無法完成該會話既定的任務。
為解決上述問題,RDS提供了DeadLock統計頁面。通過查看該頁面,可快速定位數據庫中發生的多種類型的死鎖。死鎖的詳細信息頁面展示了事務開始執行的時間、會話ID、被鎖資源詳情、死鎖的類型等信息,幫助您定位和優化引發死鎖的問題SQL及其他異常。
死鎖類型
DeadLock統計頁面中包含如下5種死鎖類型:
KeyDeadlock
ObjectDeadLock
RIDDeadlock
PageDeadlock
ComplieDeadlock
關于每種死鎖類型的解釋,請參見鎖粒度和層次結構。
鎖模式
事務訪問資源時根據訪問類型的不同,會使用不同的鎖模式(LockMode)鎖定資源。包含如下幾種模式:
共享鎖(S):保證目標資源在鎖定期間只能被讀取,不能被修改。
更新鎖(U):預定對目標資源施加排它鎖(X),在資源被當前事務施加排它鎖之前,保證該資源不會被其他事務修改。
排它鎖(X):保證目標資源在鎖定期間無法被其他事務訪問。
關于鎖模式的更多信息,請參見鎖模式。
操作步驟
- 訪問RDS實例列表,在上方選擇地域,然后單擊目標實例ID。
在左側導航欄,選擇 。
頁面介紹
死鎖數量概覽
可分時段查看近期產生的死鎖數量。
死鎖變化趨勢
展示某個時間段內發生的死鎖類型。您可以執行如下操作:
選擇起始日期和結束日期,單擊查找顯示指定時間段的死鎖信息。
說明指定的時間間隔不能超過30天。
單擊近一天、近一周、近一月快捷查詢所選時間段的死鎖信息。
將鼠標移動到特定的時間點,可查詢該時間點內發生的死鎖類型和數量。
單擊趨勢圖右上角的圖標,切換趨勢圖的顯示樣式或下載當前趨勢圖。
死鎖詳細信息
單擊左邊的圖標可展示相互鎖定的會話詳情。包含如下內容:
LastTranStarted:事務開啟的時間。
SPID:開啟事務的會話ID。
IsVictim:該會話是否已被終止(kill)。
說明SQL Server解決死鎖的方法是通過一個內部線程定期檢測系統死鎖,發現死鎖后,在引發死鎖的會話之間終止成本相對較低的會話。例如:SELECT語句的成本比UPDATE更低,系統便會優先終止使用SELECT的會話。
LogUsed:會話已經生成的日志大小。單位:字節。
LockMode:鎖模式。更多信息,請參見鎖模式。
WaitResourceDesc:當前事務等待中的資源詳情。
ObjectOwned:已經被鎖住的對象。
ObjectRequested:當前事務請求加鎖的對象。
WaitResource:當前事務等待中的資源。
HostName:當前事務的主機名稱。
LoginName:當前事務的賬號名稱。
Status:當前事務的狀態。
ClientApp:當前事務所使用的客戶端名稱。
SQLText:SQL語句詳情。
說明單擊該SQL語句可打開SQL語句窗口,單擊點擊復制可快速復制SQL語句,方便排查或回溯有問題SQL。
單擊任意一行內容可在下方展示對應的死鎖關系圖。
死鎖關系圖
展示發生死鎖的會話之間的相互關系以及被鎖定資源的詳細信息。您可以單擊點擊下載按鈕下載XDL文件,該文件中記錄了對應當前死鎖的詳細內容,可通過SQL Server Management Studio(SSMS)客戶端打開并查看。