首页 > 解决方案 > 手动释放由 sp_getapplock 生成的锁

问题描述

所以我们的应用程序sp_getapplock使用自动生成的资源密钥调用,我们遇到了死锁,应用程序被停止了。有没有办法列出sp_getapplock存储过程产生的所有应用程序锁(包括资源密钥),或者可能有另一种方法可以释放这些锁而不是重新启动数据库?

标签: sql-serversql-server-2016

解决方案


根据文档

放置在资源上的锁与当前事务或当前会话相关联。与当前事务关联的锁在事务提交或回滚时被释放。当会话注销时,与会话关联的锁将被释放。当服务器因任何原因关闭时,所有锁都会被释放。

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

至于以后解决这个问题,记录下运行 get app lock 的 spid 的信息,记录 proc 执行的返回码/参数,然后在发生灾难时可以更快地进行故障排除。

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


推荐阅读