通過 sysprocesses 解決Sql死鎖問題

changuncle發表於2017-11-07

今天我像往常一樣編寫新的模組功能(碼程式碼),突然出現了一個奇怪的現象:程式執行之後頁面一直處於載入狀態。這讓我感到不知所措,然後我就按照常用的三大策略:重新生成解決方案、重啟VS、重啟電腦,結果然並卵……在後面除錯過程中我發現Sql語句執行後遲遲拿不到結果,我隱約感覺到問題就出在這裡,後來經過查閱資料初步確定資料庫被鎖住了,那就解決死鎖的問題嘍!

按照下述四步即可輕鬆解決死鎖問題:
第一步:查詢是否發生死鎖

select dbid,* from sys.sysprocesses
where 1=1 and blocked <> 0

第二步:查詢發生阻塞或死鎖的資料庫

/*方法一*/
sp_helpdb
/*方法二*/
select dbid,name from sys.sysdatabases

第三步:查詢造成阻塞或死鎖的Sql語句

/*520對應blocked的列值*/
dbcc inputbuffer(520)

第四步:打破死鎖

kill 520

之後再從第一步進行查詢,看是否還存在死鎖,然後按照順序進行處理即可。

以下是sysprocesses 表中儲存的關於執行在 Microsoft® SQL Server™ 上的程式資訊,這些程式可以是客戶端程式或系統程式。sysprocesses 只儲存在master 資料庫中。

列名 型別 說明
spid smallint SQL Server程式 ID。
kpid smallint Microsoft Windows NT 4.0® 執行緒 ID。
blocked smallint 分塊程式的程式 ID (spid)。
waittype binary(2) 保留。
waittime int 當前等待時間(以毫秒為單位)。當程式不處於等待時為0。
lastwaittype nchar(32) 表示上次或當前等待型別名稱的字串。
waitresource nchar(32) 鎖資源的文字化表示法。
dbid smallint 當前正由程式使用的資料庫 ID。
uid smallint 執行命令的使用者 ID。
cpu int 程式的累計 CPU 時間。無論 SET STATISTICS TIME ON 選項是 ON 還是 OFF,都為所有程式更新該條目。
physical_io int 程式的累計磁碟讀取和寫入。
memusage int 當前分配給該程式的過程快取記憶體中的頁數。一個負數,表示程式正在釋放由另一個程式分配的記憶體。
login_time datetime 客戶端程式登入到伺服器的時間。對於系統程式,是儲存 SQL Server 啟動發生的時間。
last_batch datetime 客戶端程式上次執行遠端儲存過程呼叫或 EXECUTE 語句的時間。對於系統程式,是儲存 SQL Server 啟動發生的時間。
ecid smallint 用於唯一標識代表單個程式進行操作的子執行緒的執行上下文 ID。
open_tran smallint 程式的開啟事務數。
status nchar(30) 程式 ID 狀態(如執行、休眠等)。
sid binary(85) 使用者的全域性唯一識別符號 (GUID)。
hostname nchar(128) 工作站的名稱。
program_name nchar(128) 應用程式的名稱。
hostprocess nchar(8) 工作站程式 ID 號。
cmd nchar(16) 當前正在執行的命令。
nt_domain nchar(128) 客戶端的 Windows NT 4.0 域(如果使用 Windows 身份驗證)或信任連線的 Windows NT 4.0 域。
nt_username nchar(128) 程式的 Windows NT 4.0使用者名稱(如果使用 Windows 身份驗證)或信任連線的 Windows NT 4.0 使用者名稱。
net_address nchar(12) 指派給每個使用者工作站上的網路介面卡唯一識別符號。當使用者登入時,該識別符號插入net_address列。
net_library nchar(12) 用於儲存客戶端網路庫的列。每個客戶端程式都在網路連線上進入。網路連線有一個與這些程式關聯的網路庫,該網路庫使得這些程式可以建立連線。有關更多資訊,請參見客戶端和伺服器 Net-Library。
loginame nchar(128) 登入名。

相關文章