我正在解决一个似乎是随机的问题
问题有时是应用程序(动态 SL)冻结
当应用程序冻结时,我注意到 SQL 活动监视器中有一个被阻止的对象和一个头部阻止程序
在我有限的理解中,head blocker 意味着会话当前正在运行并且正在锁定资源,并且另一个会话也需要该资源。所以需要访问该资源的所有会话都无法继续,因此我在活动监视器中看到的“被阻止”
我的问题是在我见过的五种情况下,head blocker 任务状态实际上是空白的。通常任务状态是“正在运行”或“暂停”现在未运行的会话如何成为头阻塞器?
我在想我对 head blocker 的理解可能是错误的。但请启发我 ELI5 风格:)
5个案例中的每一个。我只是杀死了head blocker的进程。然后每个人都不再冻结了。
我希望找出这个头部阻滞剂的来源并提出解决方案
当我单击头部阻挡器的详细信息时。我只看到
select @@identity
请指教?
谢谢你
实际上,为了阻止会话,只需锁定其他想要的资源。它实际上不必做任何事情。例如,如果您运行以下命令
并且不要运行 COMMIT ,那么您将保持事务处于打开状态。会话没有做任何事情,实际上它不会出现在
sys.dm_exec_requests
. 然而,锁将继续被持有并继续阻止其他会话。您可以在 中找到有关未结交易的信息sys.dm_tran_session_transactions
。下一点是您看到的命令。那只是会议的最后一批。如果您打开一个事务并通过它运行多个批处理,您很可能会持有早期命令的锁,这些命令不会出现。
我在以下链接中更详细地写了这两件事:
交易:谁在什么地方
使用 sys.dm_exec_sql_text 找出阻塞有时是有缺陷的。
此外,第一个链接将包含有关如何查找谁在运行/运行有问题的事务的信息。我经常发现,如果登录名是共享登录名或 SQL ID,我可以使用
sys.dm_exec_sessions
.