死锁等待资源RID

时间:2018-03-09 11:32:58

标签: sql-server database-deadlocks

任何人都可以帮助我解决在等待资源是RID时解码死锁的确切罪魁祸首的步骤,以及如何消除死锁?

1 个答案:

答案 0 :(得分:0)

你可以使用Sp who& sp who2系统存储过程

  

sp_who的

     

Sp_who返回有关系统和用户活动的信息。   Sp_who返回以下列:Spid System进程ID   请求锁定相关线程的Ecid Execution上下文   随着spid。零表示主线程,所有其他数字表示   子线程。状态可运行,睡眠或背景。如果状态   是可运行的,这意味着该过程实际上正在执行工作,   sleep意味着进程已连接到服务器,但处于空闲状态   此时此刻。 Loginname发起锁定请求的登录名   主机名启动锁定请求的计算机的名称   Blk阻止当前锁定请求的连接   connection Dbname请求锁定的数据库名称   请求锁定的Cmd常规命令类型sp_who的语法   也允许指定单个登录,但大部分时间都是如此   将在没有参数的情况下执行。 sp_who的输出非常好   类似于sp_who2的输出。

     

sp_who2

     

Sp_who2是sp_who的较新版本。它会返回一些   附加信息:请求的Spid系统进程ID   锁定状态背景,休眠或可运行登录登录名称   已请求锁定HostName锁定请求的计算机   已启动BlkBy阻塞连接的spid   当前连接DbName锁定请求所在的数据库名称   已生成请求的Command General命令类型   lock CPUTime请求使用的毫秒数   该命令使用LastBatch Date的DiskIO磁盘输入/输出   和连接ProgramName执行的最后一批的时间   发出连接的应用程序的名称Spid如果您   无法从输出开始重复读取spid   这里示例:Sp_who2

阻止细节:

--============================================ 
--View Blocking in Current Database 
--Author: Timothy Ford 
--http://thesqlagentman.com 
--============================================ 
SELECT DTL.resource_type,  
   CASE   
       WHEN DTL.resource_type IN ('DATABASE', 'FILE', 'METADATA') THEN DTL.resource_type  
       WHEN DTL.resource_type = 'OBJECT' THEN OBJECT_NAME(DTL.resource_associated_entity_id)  
       WHEN DTL.resource_type IN ('KEY', 'PAGE', 'RID') THEN   
           (  
           SELECT OBJECT_NAME([object_id])  
           FROM sys.partitions  
           WHERE sys.partitions.hobt_id =   
           DTL.resource_associated_entity_id  
           )  
       ELSE 'Unidentified'  
   END AS requested_object_name, DTL.request_mode, DTL.request_status,    
   DOWT.wait_duration_ms, DOWT.wait_type, DOWT.session_id AS [blocked_session_id],  
   sp_blocked.[loginame] AS [blocked_user], DEST_blocked.[text] AS [blocked_command], 
   DOWT.blocking_session_id, sp_blocking.[loginame] AS [blocking_user],  
   DEST_blocking.[text] AS [blocking_command], DOWT.resource_description     
FROM sys.dm_tran_locks DTL  
   INNER JOIN sys.dm_os_waiting_tasks DOWT   
       ON DTL.lock_owner_address = DOWT.resource_address   
   INNER JOIN sys.sysprocesses sp_blocked  
       ON DOWT.[session_id] = sp_blocked.[spid] 
   INNER JOIN sys.sysprocesses sp_blocking  
       ON DOWT.[blocking_session_id] = sp_blocking.[spid] 
   CROSS APPLY sys.[dm_exec_sql_text](sp_blocked.[sql_handle]) AS DEST_blocked 
   CROSS APPLY sys.[dm_exec_sql_text](sp_blocking.[sql_handle]) AS DEST_blocking 
WHERE DTL.[resource_database_id] = DB_ID()

sp-who-to-find-dead-locks-in-SQL-Server

different-techniques-to-identify-blocking-in-sql-server

understanding-sql-server-blocking