我的问题是我的数据库。我使用mssql 2005和管理工作室。我可以通过使用活动监视器看到被阻止的进程,在那里我看到一个被阻止的进程列表。我使用其process_id杀死了阻止的进程,但这次阻止了另一个进程。我正在杀戮,但阻止仍在循环中继续。被阻止的进程'attirubites是请求模式= S请求类型= LOCK AND请求状态= GRAND。有人帮我这个吗?
答案 0 :(得分:1)
首先,如果请求被授予,则不会被阻止;当请求等待锁定时发生阻塞。
其次,当您查看哪个进程被阻塞时,通常会有一个层次结构,例如,SPID 63被SPID 128阻止,但SPID 128也被SPID 98阻止,而SPID 98又被阻止通过SPID 101.你需要的是识别最后一个,阻塞链的头部,阻止其他人但不被阻挡的人,并处理它。
这是一个可以帮助您识别头部阻止程序的查询:
select r.session_id, r.host_name, r.program_name,
r.login_name, r.nt_domain, r.nt_user_name,
r.total_elapsed_time/1000 as total_elapsed_time_sec, getdate() as vrijeme,
(select text from sys.dm_exec_sql_text(c.most_recent_sql_handle)) as sql_text
from sys.dm_exec_connections c
inner join sys.dm_exec_sessions r on r.session_id = c.session_id
where r.is_user_process = 1
and exists (
select *
from sys.dm_os_waiting_tasks r2
where r2.blocking_session_id = r.session_id
)
and not exists (
select *
from sys.dm_os_waiting_tasks r3
where r3.session_id = r.session_id
)