手动释放由sp_getapplock进行的锁定

时间:2018-09-18 15:18:34

标签: sql-server sql-server-2016

因此,带有自动生成的资源密钥的名为sp_getapplock的应用程序遇到了死锁,应用程序停顿了。 是否有任何方法可以列出由sp_getapplock存储过程创建的所有应用程序锁(包括资源密钥),或者还有另一种释放这些锁而不是重新启动DB的方法?

2 个答案:

答案 0 :(得分:1)

根据docs

  

放置在资源上的锁与当前   交易或当前会话。与当前关联的锁   在事务提交或回滚时释放事务。   与会话相关联的锁在会话被释放时被释放   登出。当服务器由于任何原因关闭时,所有锁定   已发布。

您可以绕过spid挤压,直到杀死该会话并释放锁。 您还提到了死锁,因此在这种情况下,您可以启动分析器并运行死锁图,获得杀死受害者的会话并杀死该spid。一旦会话/事务消失,该锁应被释放。

关于将来的故障排除,请记录有关运行get app锁的spid的信息,记录proc执行过程中的返回码/参数,然后在发生灾难时可以更快地进行故障排除。

此外,我强烈建议您在所有实例上放置sp_whoisactive。它将显示谁阻止了您的所有其他进程,除非它们立即被僵局杀死。

答案 1 :(得分:1)

  

我们陷入僵局

什么样的僵局? SQL Server应该检测到涉及应用程序锁和常规锁的死锁,并可以正常解决它们。

  

是否可以列出由sp_getapplock进行的所有应用程序锁定(包括资源密钥)

select request_session_id, resource_type, resource_description, request_mode, request_status, request_owner_type
from sys.dm_tran_locks
  

[是否有另一种释放这些锁的方法,而不是重新启动DB?

Kill()持有锁的会话。