1. 程式人生 > >SQL Server 顯示一直在執行中問題

SQL Server 顯示一直在執行中問題

一 sqlserver基本引數

select * from sys.sysprocesses 

檢視中主要的欄位: 
1. Spid:Sql Servr 會話ID 
2. Kpid:Windows 執行緒ID 
3. Blocked:正在阻塞求情的會話 ID。如果此列為 Null,則標識請求未被阻塞 
4. Waittype:當前連線的等待資源編號,標示是否等待資源,0 或 Null表示不需要等待任何資源 
5. Waittime:當前等待時間,單位為毫秒,0 表示沒有等待 
6. DBID:當前正由程序使用的資料庫ID 
7. UID:執行命令的使用者ID 
8. Login_time:客戶端程序登入到伺服器的時間。 
9. Last_batch:上次執行儲存過程或Execute語句的時間。對於系統程序,將儲存Sql Server 的啟動時間 
10.Open_tran:程序的開啟事務個數。如果有巢狀事務,就會大於1 
11.Status:程序ID 狀態,dormant = 正在重置回話 ; running = 回話正在執行一個或多個批處理 ; background = 回話正在執行一個後臺任務 ; rollback = 會話正在處理事務回滾 ; pending = 回話正在等待工作現成變為可用 ; runnable = 會話中的任務在等待獲取 Scheduler 來執行的可執行佇列中 ; spinloop = 會話中的任務正在等待自旋鎖變為可用 ; suspended = 會話正在等待事件完成 
12.Hostname:建立連結的客戶端工作站的名稱 
13.Program_name:應用程式的名稱,就是 連線字串中配的 Application Name 
14.Hostprocess:建立連線的應用程式在客戶端工作站裡的程序ID號 
15.Cmd:當前正在執行的命令 
16.Loginame:登入名 

應用例項: 

1. 檢查資料庫是否發生阻塞 

先查詢哪個連結的 blocked 欄位不為0。如 SPID53的blocked 欄位不為0,而是 52。SPID 52 的 blocked 為0,就可以得出結論:此時有阻塞發生,53 被 52 阻塞住了。如果你發現一個連線的 blocked 欄位的值等於它自己,那說明這個連線正在做磁碟讀寫,它要等自己的 I/O 做完。 

二. 查詢哪些執行緒堵塞,或者發生死鎖

declare @spid int,@bl int  
DECLARE s_cur CURSOR FOR   select  0 ,blocked   from (select * from sys.sysprocesses where  blocked>0 ) a  
where not exists(select * from (select * from sys.sysprocesses where  blocked>0 ) b   where a.blocked=spid)   
union 
select spid,blocked from sys.sysprocesses where  blocked>0   OPEN s_cur   FETCH NEXT FROM s_cur INTO @spid,@bl   WHILE @@FETCH_STATUS = 0  
begin   if @spid =0             
select ' 引起資料庫死鎖的是: '+ CAST(@bl AS VARCHAR(10)) + ' 程序號, 其執行的SQL 語法如下'   else              
select ' 程序號SPID :'+ CAST(@spid AS VARCHAR(10))+ ' 被' + ' 程序號SPID :'+ CAST(@bl AS VARCHAR(10)) +' 阻塞, 其當前程序執行的SQL 語法如下' 
DBCC INPUTBUFFER (@bl )   FETCH NEXT FROM s_cur INTO @spid,@bl   end   CLOSE s_cur  
DEALLOCATE s_cur

或者

use master
go
--檢索死鎖程序
select spid, blocked, loginame, last_batch, status, cmd, hostname, program_name
from sysprocesses
where spid in
( select blocked from sysprocesses where blocked <> 0 ) or (blocked <>0)

三 .幹掉發生死鎖的程序

kill spid(程序號)