SQL Server的阻塞 死鎖問題

2021-08-01 23:00:59 字數 3817 閱讀 5173

通過 sysprocesses 簡單查詢死鎖及解決死鎖辦法

簡單查詢死鎖,如下四步可以輕鬆解決:

第一步:查詢死鎖語句

1: 條件是 blocked <> 0

select dbid,* from sys.sysprocesses

where 1=1

and spid >50

and blocked <> 0

--and spid= 62

查詢結果如下圖所示:

以上查詢得出:

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

1:通過第一步查詢,知道資料庫id 為 dbid=5。

2:sp_helpdb   或    select name,dbid from master.sys.sysdatabases  查詢資料庫名稱

第三步:查詢發生阻塞或死鎖的sql語句

輸出死鎖的執行的語句:

dbcc inputbuffer(961)

語句如下:

select o.tp_login,o.tp_title, convert(varchar(10),a.timecreated,120)  as accessingdate,count(*) as docnum, 'sps' as type  from userdata u,alldocs a, userinfo o ,webs w where a.listid = u.tp_listid and a.id = u.tp_docid  and w.id = a.webid and w.siteid = a.siteid and w.siteid = o.tp_siteid and..........以後省去

第四步:殺死鎖

kill  961

之後再從第一步進行查詢,看是否還存在死鎖;

從第二步、第三步,查詢出了出問題的鎖死資料庫及sql語句,便於分析徹底解決死鎖問題。

以下是sysprocesses表中儲存關於執行在 microsoft® sql server™ 上的程序的資訊。這些程序可以是客戶端程序或系統程序。sysprocesses只儲存在master資料庫中。

列名資料型別

描述spidsmallintsql server 程序 id。

kpidsmallintmicrosoft windows nt 4.0® 執行緒 id。

blockedsmallint分塊程序的程序 id (spid)。

waittypebinary(2)保留。

waittimeint當前等待時間(以毫秒為單位)。當程序不處於等待時,為 0。

lastwaittypenchar(32)表示上次或當前等待型別名稱的字串。

waitresourcenchar(32)鎖資源的文字化表示法。

dbidsmallint當前正由程序使用的資料庫 id。

uidsmallint執行命令的使用者 id。

cpuint程序的累計 cpu 時間。無論 set statistics time on 選項是 on 還是 off,都為所有程序更新該條目。

physical_ioint程序的累計磁碟讀取和寫入。

memusageint當前分配給該程序的過程快取記憶體中的頁數。乙個負數,表示程序正在釋放由另乙個程序分配的記憶體。

login_timedatetime客戶端程序登入到伺服器的時間。對於系統程序,是儲存 sql server 啟動發生的時間。

last_batchdatetime客戶端程序上次執行遠端儲存過程呼叫或 execute 語句的時間。對於系統程序,是儲存 sql server 啟動發生的時間。

ecidsmallint用於唯一標識代表單個程序進行操作的子執行緒的執行上下文 id。

open_transmallint程序的開啟事務數。

statusnchar(30)程序 id 狀態(如執行、休眠等)。

sidbinary(85)使用者的全域性唯一識別符號 (guid)。

hostnamenchar(128)工作站的名稱。

program_namenchar(128)應用程式的名稱。

hostprocessnchar(8)工作站程序 id 號。

cmdnchar(16)當前正在執行的命令。

nt_domainnchar(128)客戶端的 windows nt 4.0 域(如果使用 windows 身份驗證)或信任連線的 windows nt 4.0 域。

nt_usernamenchar(128)程序的 windows nt 4.0使用者名稱(如果使用 windows 身份驗證)或信任連線的 windows nt 4.0 使用者名稱。

net_addressnchar(12)指派給每個使用者工作站上的網路介面卡唯一識別符號。當使用者登入時,該識別符號插入net_address列。

net_librarynchar(12)用於儲存客戶端網路庫的列。每個客戶端程序都在網路連線上進入。網路連線有乙個與這些程序關聯的網路庫,該網路庫使得這些程序可以建立連線。有關更多資訊,請參見客戶端和伺服器 net-library。

loginamenchar(128)登入名。

sqlserver死鎖阻塞

create proc p lockinfo kill lock spid bit 1,是否殺掉死鎖的程序,1 殺掉,0 僅顯示 show spid if nolock bit 1 如果沒有死鎖的程序,是否顯示正常程序資訊,1 顯示,0 不顯示 as declare count int,s nvar...

SQL SERVER 檢視死鎖和阻塞的SQL語句

檢視死鎖 select t1.resource type 資源鎖定型別 db name resource database id as 資料庫名,t1.resource associated entity id 鎖定物件,t1.request mode as等待者請求的鎖定模式,t1.request...

阻塞和死鎖

阻塞和死鎖是兩個不同的概念。舉個例子,現在有執行緒1和執行緒2,執行緒1占用了資源a,執行緒2占用了資源b。此時執行緒2需要使用資源a才能繼續,但是資源a被執行緒1所占用,那麼執行緒2只能等待資源a被執行緒1釋放掉,這種情況稱為執行緒2被阻塞。但是,如果此時執行緒1也許要資源b才能繼續,那麼兩個執行...