sql-server - 手动释放由 sp_getapplock 生成的锁
问题描述
所以我们的应用程序sp_getapplock
使用自动生成的资源密钥调用,我们遇到了死锁,应用程序被停止了。有没有办法列出sp_getapplock
存储过程产生的所有应用程序锁(包括资源密钥),或者可能有另一种方法可以释放这些锁而不是重新启动数据库?
解决方案
根据文档:
放置在资源上的锁与当前事务或当前会话相关联。与当前事务关联的锁在事务提交或回滚时被释放。当会话注销时,与会话关联的锁将被释放。当服务器因任何原因关闭时,所有锁都会被释放。
您可以绕过 spid 挤压,直到您终止会话并释放锁。您还提到了死锁,因此在这种情况下,您可以启动分析器并运行死锁图,获取杀死受害者的会话,然后杀死该 spid。一旦会话/事务消失,锁应该被释放。
至于以后解决这个问题,记录下运行 get app lock 的 spid 的信息,记录 proc 执行的返回码/参数,然后在发生灾难时可以更快地进行故障排除。
另外,我强烈建议您将sp_whoisactive放在所有实例上。它将显示谁在阻止您的所有其他进程,除非它们立即被死锁杀死。
推荐阅读
- dart - Dart 有无抽象关键字有什么区别?
- javascript - 通过Cucumber-Protractor,无法获取网页标题
- react-native - `render()` 函数内第一行引用的`this.props` 定义在哪里?
- python-3.x - 如何在不循环所有单元格的情况下将 openpyxl 单元格的范围转换为 pandas 数据框?
- css - 不透明度的CSS转换scaleX在Safari中不起作用
- php - 使用 laravel 的 Paypal 退款金额
- tensorflow - 如何在高级 Estimator api 中使用 tf.print(不是 tf.Print)
- python - 通过 python 脚本或使用 django 模型每小时更新一次 PostgreSQL 数据库?
- sqlite - 部署 Universal App 后部署的 SQLite 数据库为空
- ios - 如何搜索所有目录?目标 C