sqlserver死锁查询语句

DECLARE @SessionName SysName 
 
SELECT @SessionName = 'system_health'
 
 
IF OBJECT_ID('tempdb..#Events') IS NOT NULL BEGIN
    DROP TABLE #Events
END
 
DECLARE @Target_File NVARCHAR(1000)
    , @Target_Dir NVARCHAR(1000)
    , @Target_File_WildCard NVARCHAR(1000)
 
SELECT @Target_File = CAST(t.target_data AS XML).value('EventFileTarget[1]/File[1]/@name', 'NVARCHAR(256)')
FROM sys.dm_xe_session_targets t
    INNER JOIN sys.dm_xe_sessions s ON s.address = t.event_session_address
WHERE s.name = @SessionName
    AND t.target_name = 'event_file'
 
SELECT @Target_Dir = LEFT(@Target_File, LEN(@Target_File) - CHARINDEX('\', REVERSE(@Target_File))) 
 
SELECT @Target_File_WildCard = @Target_Dir + '\'  + @SessionName + '_*.xel'
 
--Keep this as a separate table because it's called twice in the next query.  You don't want this running twice.
SELECT DeadlockGraph = CAST(event_data AS XML)
    , DeadlockID = ROW_NUMBER() OVER(ORDER BY file_name, file_offset)
INTO #Events
FROM sys.fn_xe_file_target_read_file(@Target_File_WildCard, NULL, NULL, NULL) AS F
WHERE event_data LIKE '<event name="xml_deadlock_report%'
 
;WITH Victims AS
(
    SELECT VictimID = Deadlock.Victims.value('@id', 'varchar(50)')
        , e.DeadlockID 
    FROM #Events e
        CROSS APPLY e.DeadlockGraph.nodes('/event/data/value/deadlock/victim-list/victimProcess') AS Deadlock(Victims)
)
, DeadlockObjects AS
(
    SELECT DISTINCT e.DeadlockID
        , ObjectName = Deadlock.Resources.value('@objectname', 'nvarchar(256)')
    FROM #Events e
        CROSS APPLY e.DeadlockGraph.nodes('/event/data/value/deadlock/resource-list/*') AS Deadlock(Resources)
)
SELECT *
FROM
(
    SELECT e.DeadlockID
        , TransactionTime = Deadlock.Process.value('@lasttranstarted', 'datetime')
        , DeadlockGraph
        , DeadlockObjects = SUBSTRING((SELECT (', ' + o.ObjectName)
                            FROM DeadlockObjects o
                            WHERE o.DeadlockID = e.DeadlockID
                            ORDER BY o.ObjectName
                            FOR XML PATH ('')
                            ), 3, 4000)
        , Victim = CASE WHEN v.VictimID IS NOT NULL 
                            THEN 1 
                        ELSE 0 
                        END
        , SPID = Deadlock.Process.value('@spid', 'int')
        , ProcedureName = Deadlock.Process.value('executionStack[1]/frame[1]/@procname[1]', 'varchar(200)')
        , LockMode = Deadlock.Process.value('@lockMode', 'char(1)')
        , Code = Deadlock.Process.value('executionStack[1]/frame[1]', 'varchar(1000)')
        , ClientApp = CASE LEFT(Deadlock.Process.value('@clientapp', 'varchar(100)'), 29)
                        WHEN 'SQLAgent - TSQL JobStep (Job '
                            THEN 'SQLAgent Job: ' + (SELECT name FROM msdb..sysjobs sj WHERE SUBSTRING(Deadlock.Process.value('@clientapp', 'varchar(100)'),32,32)=(SUBSTRING(sys.fn_varbintohexstr(sj.job_id),3,100))) + ' - ' + SUBSTRING(Deadlock.Process.value('@clientapp', 'varchar(100)'), 67, LEN(Deadlock.Process.value('@clientapp', 'varchar(100)'))-67)
                        ELSE Deadlock.Process.value('@clientapp', 'varchar(100)')
                        END 
        , HostName = Deadlock.Process.value('@hostname', 'varchar(20)')
        , LoginName = Deadlock.Process.value('@loginname', 'varchar(20)')
        , InputBuffer = Deadlock.Process.value('inputbuf[1]', 'varchar(1000)')
    FROM #Events e
        CROSS APPLY e.DeadlockGraph.nodes('/event/data/value/deadlock/process-list/process') as Deadlock(Process)
        LEFT JOIN Victims v ON v.DeadlockID = e.DeadlockID AND v.VictimID = Deadlock.Process.value('@id', 'varchar(50)')
) X
ORDER BY DeadlockID DESC



参数化查询:
[参数化查询](https://www.cnblogs.com/lzrabbit/archive/2012/04/21/2460978.html)



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL Server中,可以通过查询系统视图和动态管理视图来查找死锁信息。 要查找死锁信息,可以使用以下查询: SELECT dl.resource_type, dl.request_mode, dl.request_session_id, wt.blocking_session_id, wt.wait_duration_ms, wt.wait_type, wt.wait_resource, sqltext.text FROM sys.dm_tran_locks AS dl INNER JOIN sys.dm_os_waiting_tasks AS wt ON dl.lock_owner_address = wt.resource_address OUTER APPLY sys.dm_exec_sql_text(wt.sql_handle) AS sqltext WHERE dl.request_session_id IN ( SELECT blocked_session_id FROM sys.dm_os_waiting_tasks ) OR dl.request_session_id IN ( SELECT session_id FROM sys.dm_os_waiting_tasks ) ORDER BY wt.wait_duration_ms DESC; 有关死锁查询语句的解释如下: - sys.dm_tran_locks:这个系统视图提供了锁的信息,如资源类型、请求模式和请求会话ID等。 - sys.dm_os_waiting_tasks:这个动态管理视图提供了等待任务的信息,包括阻塞会话ID、等待持续时间、等待类型和等待资源等。 - sys.dm_exec_sql_text:这个函数可以获取SQL文本,以便确定正在执行的查询查询语句中使用了INNER JOIN将sys.dm_tran_locks和sys.dm_os_waiting_tasks视图连接起来,通过资源地址来匹配锁的所有者和等待任务。 WHERE子句使用子查询来筛选出正在被阻塞或正在等待的会话ID,然后将结果集按照等待持续时间降序排序。 这样,就可以获取到正在发生死锁的会话信息,并查看对应的SQL语句,以便分析死锁的原因和解决方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值