小崔说SAP技术博客 - 死锁
type: channel
link: https://sapxiaocui.top/index.php/tag/%E6%AD%BB%E9%94%81/
items: SQL 死锁查询与解决办法

SQL 死锁查询与解决办法
type: item
date: 2024-03-01T01:47:00+00:00
description: use master go declare @spid int,@bl int DECLARE s_cur CURSOR FOR 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 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 --死锁查询 select 标志, 进程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 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 blocked0 )a order by s1,s2; SELECT t1.resource_type [资源锁定类型], DB_NAME(resource_database_id) AS 数据库名, t1.resource_associated_entity_id 锁定对象, t1.request_mode AS 等待者请求的锁定模式, t1.request_session_id 等待者SID, t2.wait_duration_ms 等待时间, ( SELECT TEXT FROM sys.dm_exec_requests r CROSS apply sys.dm_exec_sql_text (r.sql_handle) WHERE r.session_id = t1.request_session_id ) AS 等待者要执行的SQL, t2.blocking_session_id [锁定者SID], ( SELECT TEXT FROM sys.sysprocesses p CROSS apply sys.dm_exec_sql_text (p.sql_handle) WHERE p.spid = t2.blocking_session_id ) 锁定者执行语句 FROM sys.dm_tran_locks t1, sys.dm_o…