我自己的數據庫表記錄死鎖后的 根據以下資料的 解決方案:
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) 查看一起死鎖的語句內容
以上方法應該能解決你的問題。
