SQL Server 表,記錄 死鎖解決辦法


我自己的數據庫表記錄死鎖后的 根據以下資料的 解決方案:

 1. 先根據以下語句 查詢 哪些表被 死鎖,及 死鎖的  spid

SELECT request_session_id spid,OBJECT_NAME(resource_associated_entity_id)tableName 
FROM sys.dm_tran_locks 
WHERE resource_type='OBJECT ' 

2. 再根據以上 語句查詢出來的 spid 通過以下存儲過程 查詢是哪台機客戶機 在操作,造成的死鎖

exec sp_who2 'xxx'  -- xxx 是 spid 替換進去就好,就可以看到是哪台機造成的死鎖.

3. 最后通過 以下語句來清退進程,(當然我這次是因為查到是哪機子在操作,所以讓那台機子的客戶機退出客戶端 就可以了.)

KILL xxx   -- xxx 是spid 執行就好

 

 

 

 

 

方法一:

摘自: http://www.jb51.net/article/28163.htm

前些天寫一個存儲過程,存儲過程中使用了事務,后來我把一些代碼注釋掉來進行調試找錯,突然發現一張表被鎖住了,原來是創建事務的代碼忘記注釋掉。本文表鎖住了的解決方法。
-
其實不光是上面描述的情況會鎖住表,還有很多種場景會使表放生死鎖,解鎖其實很簡單,下面用一個示例來講解:

1 首先創建一個測試用的表:
復制代碼 代碼如下:
CREATE TABLE Test
(
TID INT IDENTITY(1,1)
)

2 執行下面的SQL語句將此表鎖住:
復制代碼 代碼如下:
SELECT * FROM Test WITH (TABLOCKX)

3 通過下面的語句可以查看當前庫中有哪些表是發生死鎖的:
復制代碼 代碼如下:
SELECT request_session_id spid,OBJECT_NAME(resource_associated_entity_id)tableName
FROM sys.dm_tran_locks
WHERE resource_type='OBJECT '

4 上面語句執行結果如下:

 


spid :被鎖進程ID。
tableName:發生死鎖的表名。

5 只需要使用kill關鍵字來殺掉被鎖的進程ID就可以對表進行解鎖:

KILL 52
詳細出處參考:http://www.jb51.net/article/28163.htm

 

方法二:

摘自: http://database.51cto.com/art/201011/233039.htm

SQL Server死鎖使我們經常遇到的問題,下面就為您介紹如何查詢SQL Server死鎖,希望對您學習SQL Server死鎖方面能有所幫助。

SQL Server死鎖的查詢方法:

 

exec master.dbo.p_lockinfo 0,0 ---顯示死鎖的進程,不顯示正常的進程  
 
exec master.dbo.p_lockinfo 1,0 ---殺死死鎖的進程,不顯示正常的進程

 

SQL Server死鎖的解除方法:

 

Create proc p_lockinfo  
@kill_lock_spid bit=1, --是否殺掉死鎖的進程,1 殺掉, 0 僅顯示  
@show_spid_if_nolock bit=1 --如果沒有死鎖的進程,是否顯示正常進程信息,1 顯示,0 不顯示  
as  
 
declare @count int,@s nvarchar(1000),@i int  
select id=identity(int,1,1),標志,  
進程ID=spid,線程ID=kpid,塊進程ID=blocked,數據庫ID=dbid,  
數據庫名=db_name(dbid),用戶ID=uid,用戶名=loginame,累計CPU時間=cpu,  
登陸時間=login_time,打開事務數=open_tran, 進程狀態=status,  
工作站名=hostname,應用程序名=program_name,工作站進程ID=hostprocess,  
域名=nt_domain,網卡地址=net_address  
into #t from(  
select 標志='死鎖的進程',  
spid,kpid,a.blocked,dbid,uid,loginame,cpu,login_time,open_tran,  
status,hostname,program_name,hostprocess,nt_domain,net_address,  
s1=a.spid,s2=0 
from master..sysprocesses a join (  
select blocked from master..sysprocesses group by blocked  
)b on a.spid=b.blocked where a.blocked=0 
union all  
select '|_犧牲品_>',  
spid,kpid,blocked,dbid,uid,loginame,cpu,login_time,open_tran,  
status,hostname,program_name,hostprocess,nt_domain,net_address,  
s1=blocked,s2=1 
from master..sysprocesses a where blocked<>0  
)a order by s1,s2  
 
select @count=@@rowcount,@i=1 
 
if @count=0 and @show_spid_if_nolock=1 
begin  
insert #t  
select 標志='正常的進程',  
spid,kpid,blocked,dbid,db_name(dbid),uid,loginame,cpu,login_time,  
open_tran,status,hostname,program_name,hostprocess,nt_domain,net_address  
from master..sysprocesses  
set @count=@@rowcount  
end  
 
if @count>0  
begin  
create table #t1(id int identity(1,1),a nvarchar(30),b Int,EventInfo nvarchar(255))  
if @kill_lock_spid=1 
begin  
declare @spid varchar(10),@標志 varchar(10)  
while @i<=@count  
begin  
   select @spid=進程ID,@標志=標志 from #t whereid=@i  
   insert #t1 exec('dbcc inputbuffer('+@spid+')')  
   if @標志='死鎖的進程' exec('kill'+@spid)  
   set @i=@i+1  
end  
end  
else  
while @i<=@count  
begin  
   select @s='dbcc inputbuffer('+cast(進程ID as varchar)+')' from #t whereid=@i  
   insert #t1 exec(@s)  
   set @i=@i+1  
end  
select a.*,進程的SQL語句=b.EventInfo  
from #t a join #t1 b on a.id=b.id  
end  

 

 

 

方法三:

1、select * from sys.dm_tran_locks或sp_LOCK 查看request_node 字段中為'X'(排他鎖)或'IX'(意向排他鎖)
2、用sp_who2 + pid(進程ID) 查看進程的詳細信息
3、用dbcc inputbuffer(pid) 查看一起死鎖的語句內容
以上方法應該能解決你的問題。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM