SQL Server检测阻塞

如果一个事务持有某一数据资源上的锁,而另一事务请求相同资源上不兼容的锁,则对新锁的请求将被阻塞,发出请求的事务进入等待状态。在默认情况下,被阻塞的请求会一直等待,直到原来的事务释放相关的锁。

如果事务的运行时间太长,会导致持有锁的时间也过久。这是可以尝试缩短事务处理,把不属于工作单元的操作移到事务外面。在某些情况下,应用程序的bug也会导致事务一直打开。

---------------------------检测阻塞---------------------------

--返回 SQL Server 2017 中有关当前活动的锁管理器资源的信息。 
--向锁管理器发出的已授予锁或正等待授予锁的每个当前活动请求分别对应一行。

SELECT 
request_session_id AS spid,   --当前拥有该请求的会话 ID。 对于分布式事务和绑定事务,拥有请求的会话 ID 可能不同。 该值为 -2 时,指示该请求属于孤立的分布式事务。 该值为 -3 时,指示请求属于延迟的恢复事务,例如因其回滚未能成功完成而延迟恢复该回滚的事务。
resource_type AS restype,     --表示资源类型。 该值可以是下列值之一:DATABASE、FILE、OBJECT、PAGE、KEY、EXTENT、RID、APPLICATION、METADATA、HOBT 或 ALLOCATION_UNIT。
resource_database_id AS dbid, --此资源位于其范围之内的数据库的 ID。 由锁管理器处理的所有资源均按该数据库 ID 划分范围。
DB_NAME(resource_database_id) AS dbname,
resource_description AS res,
resource_associated_entity_id AS resid,
request_mode AS mode,		  -锁的性质
request_status AS status      -锁的状态
FROM SYS.dm_tran_locks    

--根据Session ID查询正在阻塞的SQL语句

SELECT 
session_id AS spid,text
FROM SYS.dm_exec_connections
cross apply sys.dm_exec_sql_text(most_recent_sql_handle) AS ST
WHERE session_id = 57

--正在执行的会话
SELECT 
session_id AS spid,
login_time,           --建立会话的时间
host_name,			  --客户端工作站的名称
program_name,         
login_name,           --会话所使用SQL Server登录名
nt_user_name,         --客户端Windows用户名
last_request_start_time, --最后一次会话请求开始时间
last_request_end_time    --最后一次会话请求结束时间
FROM SYS.dm_exec_sessions

--这个视图每一行表示一个活动的请求,当blocking_session_id大于0时,就能查到阻塞的请求。
SELECT 
session_id AS spid,
blocking_session_id,
command,
sql_handle,
database_id,
wait_type,
wait_time,
wait_resource
FROM SYS.dm_exec_requests
WHERE blocking_session_id > 0
--这样就能比较容易地识别阻塞链所涉及到的会话,命令,等待时间,资源等信息。

KILL 55   --关闭阻塞请求

猜你喜欢

转载自blog.csdn.net/xc917563264/article/details/81383779