释放在SQL Server上使用sp_getapplock获取的另一个用户锁

jos*_*rry 4 sql-server locking

我们有一个系统,用于sp_getapplock在有人在GUI中打开订单时创建独占的互斥锁.这用于防止多人同时更改订单.

有时人们会打开订单回家,让它打开.这有效地阻止了任何人能够对订单进行更改.然后我收到电子邮件,电话并最终kill <spid>在企业管理器中进行操作.显然我已经厌倦了这一点,并希望快速自助服务webform.

我遇到的主要问题是kill需要sysadmin权限,我不想给我们网站运行的用户.我试过sp_releaseapplock但这不会让你释放另一个用户的锁(即使把它作为系统管理员调用).

所以,最后我的问题; 有没有人知道另一种释放其他用户使用的锁的替代方法sp_getapplock

Aar*_*ght 9

关于这一点,文档非常明确:

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

Applock类似于Critical Sections - 它们存在的主要原因是其他线程不能简单地覆盖它们,除非它们有权杀死持有锁的进程.

您是否考虑过使用某种形式的乐观并发?Applock一次只能保留不到一秒钟 - 即典型交易的持续时间.正是出于这个原因,暂时坚持几分钟(或几小时)并不是一个好主意.

如果你必须以这种方式使用applock,并且不能使用乐观并发,那么我相信你唯一的办法就是杀掉拥有锁的spid.

如果你不想给用户提供sysadmin权限,你可以创建一个存储过程来终止进程WITH EXECUTE AS <admin_user>...当然,请记住这会打开一个相当广泛的安全漏洞,所以要小心你授予执行权限.