『壹』 sqlserver怎麼用sql查看具體那個表被鎖住了
查看被鎖表:
select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName
from sys.dm_tran_locks where resource_type='OBJECT'
--spid 鎖表進程
--tableName 被鎖表名
解鎖:
declare @spid int
Set @spid = 57 --鎖表進程
declare @sql varchar(1000)
set @sql='kill '+cast(@spid as varchar)
exec(@sql)
--查詢出死鎖的SPID
select blocked
from (select * from sysprocesses where blocked>0 ) a
where not exists(select * from (select * from sysprocesses where blocked>0 ) b
where a.blocked=spid)
--輸出引起死鎖的操作
DBCC INPUTBUFFER (@spid)
--查詢當前進程數
select count(-1) from sysprocesses
where dbid in (select dbid from sysdatabases where name like '%telcount%');
『貳』 如何查看SQL表死鎖
SELECT SPID=p.spid,
DBName = convert(CHAR(20),d.name),
ProgramName = program_name,
LoginName = convert(CHAR(20),l.name),
HostName = convert(CHAR(20),hostname),
Status = p.status,
BlockedBy = p.blocked,
LoginTime = login_time,
QUERY = CAST(t.TEXT AS VARCHAR(MAX))
FROM MASTER.dbo.sysprocesses p
INNER JOIN MASTER.dbo.sysdatabases d
ON p.dbid = d.dbid
INNER JOIN MASTER.dbo.syslogins l
ON p.sid = l.sid
CROSS APPLY sys.dm_exec_sql_text(sql_handle) t
WHERE p.blocked = 0
AND EXISTS (SELECT 1
FROM MASTER.dbo.sysprocesses p1
WHERE p1.blocked = p.spid)
SELECT SPID=p.spid,
DBName = convert(CHAR(20),d.name),
ProgramName = program_name,
LoginName = convert(CHAR(20),l.name),
HostName = convert(CHAR(20),hostname),
Status = p.status,
BlockedBy = p.blocked,
LoginTime = login_time,
QUERY = CAST(t.TEXT AS VARCHAR(MAX))
FROM MASTER.dbo.sysprocesses p
INNER JOIN MASTER.dbo.sysdatabases d
ON p.dbid = d.dbid
INNER JOIN MASTER.dbo.syslogins l
ON p.sid = l.sid
CROSS APPLY sys.dm_exec_sql_text(sql_handle) t
WHERE p.blocked = 0
AND EXISTS (SELECT 1
FROM MASTER.dbo.sysprocesses p1
WHERE p1.blocked = p.spid)
用這個查詢兩次,如果兩次都有某個語句就是了,可以用kill結束它
『叄』 如何查看SQL死鎖
其實所有的死鎖最深層的原因就是一個:資源競爭
表現一:
一個用戶A
訪問表A(鎖住了表A),然後又訪問表B
另一個用戶B
訪問表B(鎖住了表B),然後企圖訪問表A
這時用戶A由於用戶B已經鎖住表B,它必須等待用戶B釋放表B,才能繼續,好了他老人家就只好老老實實在這等了
同樣用戶B要等用戶A釋放表A才能繼續這就死鎖了
解決方法:
這種死鎖是由於你的程序的BUG產生的,除了調整你的程序的邏輯別無他法
仔細分析你程序的邏輯,
1:盡量避免同時鎖定兩個資源
2:
必須同時鎖定兩個資源時,要保證在任何時刻都應該按照相同的順序來鎖定資源.
表現二:
用戶A讀一條紀錄,然後修改該條紀錄
這是用戶B修改該條紀錄
這里用戶A的事務里鎖的性質由共享鎖企圖上升到獨占鎖(for
update),而用戶B里的獨占鎖由於A有共享鎖存在所以必須等A釋
放掉共享鎖,而A由於B的獨占鎖而無法上升的獨占鎖也就不可能釋放共享鎖,於是出現了死鎖。
這種死鎖比較隱蔽,但其實在稍大點的項目中經常發生。
解決方法:
讓用戶A的事務(即先讀後寫類型的操作),在select
時就是用Update
lock
語法如下:
select
*
from
table1
with(updlock)
where
....
『肆』 如何查看SQL Server 2008的死鎖
為了查看死鎖信息,資料庫引擎提供了監視工具,分別為兩個跟蹤標志以及
SQL
Server
Profiler中的死鎖圖形事件。
跟蹤標志
1204
和跟蹤標志
1222
發生死鎖時,跟蹤標志
1204
和跟蹤標志
1222
會返回在
SQL
Server
錯誤日誌中捕獲的信息。跟蹤標志
1204
會報告由死鎖所涉及的每個節點設置格式的死鎖信息。跟蹤標志
1222
會設置死鎖信息的格式,順序為先按進程,然後按資源。可以同時啟用這兩個跟蹤標志,以獲取同一個死鎖事件的兩種表示形式。
SQL
Server
Profiler
中的
TraceEvent
Class:
LocksEvent
Name:
Deadlock
Graph
提供
一個XML
圖表.,你可以從中看出發生了什麼。
『伍』 怎麼看sql server 資料庫是死鎖
--死鎖檢測
use master
Select * from sysprocesses where blocked<>0
--找到SPID
exec sp_lock
--根據SPID找到OBJID
select object_name(85575343)
--根據OBJID找到表名
『陸』 如何查看sql 死鎖圖
使用SQL Server Profiler,新建跟蹤-連接資料庫-事件選擇頁簽,「顯示所有事件」那裡打勾,然後展開「Locks」,第一行就是死鎖圖。把這一行勾上,點擊「運行」。當資料庫中出現死鎖時,就能看到死鎖圖了。
『柒』 如何查看SQL Server 2008的死鎖
在SQL Server 2008資料庫中,查看死鎖可以用存儲過程來實現,本文我們主要就介紹了SQL Server 2008查看死鎖的存儲過程的代碼示例,希望能夠對您有所幫助。
代碼示例如下:
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[sp_who_lock]') and OBJECTPROPERTY(id, N'IsProcere') = 1) drop procere [dbo].[sp_who_lock] GO use master go create procere sp_who_lock as begin declare @spid int,@bl int, @intTransactionCountOnEntry int, @intRowcount int, @intCountProperties int, @intCounter int create table #tmp_lock_who ( id int identity(1,1), spid smallint, bl smallint) IF @@ERROR<>0 RETURN @@ERROR insert into #tmp_lock_who(spid,bl) select 0 ,blocked from (select * from sysprocesses where blocked>0 ) a where not exists(select * from (select * from sysprocesses where blocked>0 ) b where a.blocked=spid) union select spid,blocked from sysprocesses where blocked>0 IF @@ERROR<>0 RETURN @@ERROR -- 找到臨時表的記錄數 select @intCountProperties = Count(*),@intCounter = 1 from #tmp_lock_who IF @@ERROR<>0 RETURN @@ERROR if @intCountProperties=0 select '現在沒有阻塞和死鎖信息' as message -- 循環開始 while @intCounter <= @intCountProperties begin -- 取第一條記錄 select @spidspid = spid,@blbl = bl from #tmp_lock_who where Id = @intCounter 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 ) end -- 循環指針下移 set @intCounter = @intCounter + 1 end drop table #tmp_lock_who return 0 end
以上就是SQL Server 2008查看死鎖的存儲過程的代碼示例的全部內容,本文我們就介紹到這里了,希望本次的介紹能夠對您有所收獲!
『捌』 如何查看MySQL資料庫的死鎖信息
查看MySQL資料庫的死鎖日誌
1. 使用終端或命令提示符登錄到MySQL,輸入命令:mysql -h xxxx.xxx.xxx -P 3306 -u username -p解釋:xxxx.xxx.xxx是資料庫IP地址,username是資料庫用戶名,輸入命令後,會讓你輸入username對應的密碼,就可以登錄了
4. 如何分析日誌,定位死鎖原因看3裡面的圖,紫色劃線部分分析:事務1,等待RECORD LOCKS space id 553 page no 376 n bits 368 index `index_user_id` of table `tbj`.`score_user`,這個位置的X鎖事務2,持有RECORD LOCKS space id 553 page no 376 n bits 368 index `index_user_id` of table `tbj`.`score_user`這個地方的S鎖事務2,等待這個地方的X鎖理論上這個事務2是可以提交的不會,死鎖,但是這個事務日誌只列印最後一部分死鎖,信息,這裡面隱含的條件是,事務1也持有RECORD LOCKS space id 553 page no 376 n bits 368 index `index_user_id` of table `tbj`.`score_user`這個地方的S鎖,這樣,事務2不能加X鎖,同時事務1也不能加X鎖,產生死鎖。