【问题标题】:What is @Resource supposed to refer to when using sp_getapplock?使用 sp_getapplock 时,@Resource 应该指代什么?
【发布时间】:2011-07-31 03:58:17
【问题描述】:

sp_getapplock 的 MSDN 文档说:

[ @Resource= ] 'resource_name' 是指定名称的字符串 标识锁资源。

sp_getapplock 创建的锁资源是在当前数据库中为 会议。每个锁资源由以下组合值标识:

  • 包含锁资源的数据库的数据库 ID。
  • @DbPrincipal 参数中指定的数据库原则。
  • @Resource 参数中指定的锁名称。

我的问题:
1. 'resource_name' 只是你编造的旧名称吗?
2. 'resource_name' 是否必须引用表名或存储的过程名或(命名的)事务名?

【问题讨论】:

    标签: sql sql-server tsql stored-procedures


    【解决方案1】:

    是的,它是您编造的任何旧名称。你可以说“sp_getapplock 'kitten'”,它会等待“kitten”锁被释放,然后再自己获取它并继续。您必须定义对序列化访问有意义的资源。

    我不喜欢在表之后命名锁的想法,因为这意味着其他编码人员在 SQL Server 中没有任何东西(除了 applock 框架)来强制执行该表时,对表的访问是序列化的。换句话说,applocks 有点像红绿灯。红灯本身并没有阻止你前进的东西。最好不要这样做。

    【讨论】:

    • 后续跟进:(1) 是否有最佳实践可以遵守? (2) 是否存在您必须或想要在您的 t-sql 代码中引用“小猫”的情况,或者是您调用 sp_getapplock 时唯一重要的时间?
    • 我不知道任何关于 sp_getapplock 的最佳实践。我确实知道我从未在生产代码中看到过它。不过,我想你能找到的关于信号量的任何东西都将适用于这里。至于您使用的锁的名称,我认为它在 sp_getapplock(当然还有相关的 sp_releaseapplock)之外的任何地方都不相关。
    • “...从未在生产代码中见过它”。很高兴知道。我想知道 Remus 在这里的回复:stackoverflow.com/questions/6880588/… 当我尝试实现它时,它给我造成了锁定,这似乎违背了我希望可以完成的全部目的。 stackoverflow.com/questions/6853327/…
    • applocks 不会放弃获取锁的需要,否则需要完成您正在尝试做的事情。也就是说,如果您尝试重命名一个表并且该表正在被查询,那么重命名将一直等到它不被使用。
    猜你喜欢
    • 1970-01-01
    • 2011-03-14
    • 2023-04-02
    • 2011-04-15
    • 2017-04-10
    • 2012-03-19
    • 2018-05-12
    • 2018-12-11
    • 1970-01-01
    相关资源
    最近更新 更多