代码之家  ›  专栏  ›  技术社区  ›  joshperry

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

  •  4
  • joshperry  · 技术社区  · 14 年前

    我们有一个系统 sp_getapplock 要在任何时候有人在GUI中打开订单时创建独占互斥。这用于防止多人同时更改订单。

    有时人们会打开一个订单,然后回家,把它打开。这有效地阻止了任何人对订单进行更改。然后我收到电子邮件,打电话,最后做了一个 kill <spid> 在Enterprise Manager中。很明显,我已经厌倦了这一点,我想制作一个快速自助式的网络表单。

    我遇到的主要问题是 kill 需要系统管理员权限,我不想将该权限授予我们的网站以其身份运行的用户。我试过了 sp_releaseapplock 但这并不能让您释放另一个用户的锁(即使在以系统管理员的身份调用它时也是如此)。

    所以,最后我的问题是:有人知道另一个用户使用另一种方法来释放锁吗? SPGETGAPPACKORK ?

    1 回复  |  直到 14 年前
        1
  •  9
  •   Aaronaught    14 年前

    这个 documentation 这一点非常清楚:

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

    AppLock类似于关键部分——它们存在的主要原因是其他线程 不能 只需重写它们,除非它们具有杀死持有锁的进程的特权。

    您是否考虑改用某种形式的乐观并发?AppLock一次的保存时间不超过一秒钟,即典型交易的持续时间。正是因为这个原因,坚持几分钟(或几小时)通常不是一个好主意。

    如果您必须这样使用applocks,并且不能使用乐观并发,那么我相信您唯一的方法是杀死拥有锁的SPID。

    如果不想授予用户sysadmin特权,可以创建一个存储过程来终止该进程。 WITH EXECUTE AS <admin_user> …当然,要记住,这会打开一个相当大的安全漏洞,所以要非常小心您授予谁执行权限。