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

时间:2010-04-28 01:38:13

标签: sql-server locking

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

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

我遇到的主要问题是kill需要sysadmin权限,我不想将这些权限提供给我们网站运行的用户。我尝试了sp_releaseapplock,但这不允许你释放另一个用户的锁(即使把它作为系统管理员调用)。

所以,最后我的问题;有没有人知道另一种方法来释放另一个用户使用sp_getapplock获得的锁?

1 个答案:

答案 0 :(得分:9)

documentation在这一点上非常明确:

  

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

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

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

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

如果您不想为用户提供sysadmin权限,您可以创建一个存储过程来终止进程{​​{1}} ...当然,请记住,这会打开相当广泛的安全性是的,所以要非常小心你授予执行权限。