【问题标题】:Queue up requests to a sql server stored procedure将请求排队到 sql server 存储过程
【发布时间】:2011-11-23 14:27:58
【问题描述】:

我正在使用一个存储过程:

  1. 确定表中 selectedBy 列为空的行数

  2. 随机选择其中一行

  3. 更新该行的 selectedBy 列

  4. 将行返回给客户端

如何防止客户在完全相同的时间选择同一行?

我尝试了各种表提示和隔离级别,但只是在客户端出现死锁异常。我只希望第二次调用等待几分之一秒,直到第一次调用完成。

【问题讨论】:

  • 基本上你是using a table as a queue,但它真的需要随机,因为这大大增加了问题。
  • 只要它看起来是相对随机的(即它不是连续的)就足够了。
  • 使用sp_getapplock 序列化对存储过程的访问而不是尝试管理并发和避免死锁的解决方案怎么样?
  • 不熟悉,但看了 MSDN 之后,你的意思是我在我的客户端代码中调用它。即获取锁。如果成功执行sproc,否则等待并重试还是更自动?
  • 您将它放在存储过程本身中,然后在代码末尾sp_releaseapplock 以序列化对该代码的访问。这意味着您不会遇到死锁,但可能会遇到等待和超时,这取决于代码运行所需的时间以及并发尝试发生的频率。

标签: sql-server sql-server-2008 locking deadlock isolation-level


【解决方案1】:

避免死锁的一种方法(如您的问题标题所示)是序列化对该过程的访问。

您可以使用sp_getapplocksp_releaseapplock 来做到这一点

有关示例代码,请参阅Application Locks (or Mutexes) in SQL Server 2005

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-10
    相关资源
    最近更新 更多