问题的起源,
一个存储过程去调用另外一个存储过程(计算一个数据库中的在线时间)
中间使用很多循环。
由于外层存储过程增加了事务。在执行外层存储过程的时候有一执行时间过长,
如果取消了整个事务,就会导致相关的表被阻塞。
使用如下语句查看阻塞是否存在
SELECT blocking_session_id, wait_duration_ms, session_id FROM sys.dm_os_waiting_tasks
WHERE blocking_session_id is NOT null
查看连接的一些信息
select connect_time,last_read,last_write,most_recent_sql_handle
from sys.dm_exec_connections where session_id in(95)
查看会话信息
select login_time,host_name,program_name,login_name,last_request_start_time,last_request_end_time
from sys.dm_exec_sessions where session_id in(95)
查看正在执行阻塞的请求
select
session_id,blocking_session_id,wait_type,wait_time,wait_resource
from
sys.dm_exec_requests
where
blocking_session_id>0
如图所示,根据等待类型和等待执行查看是由于
OBJECT,670625432 被锁住了,查看这个OBJECT的名字可以知道他是一个表
查明原因后,使用kill 语句把对应的SPID kill 掉就可以了。