【发布时间】:2011-11-23 14:27:58
【问题描述】:
我正在使用一个存储过程:
确定表中 selectedBy 列为空的行数
随机选择其中一行
更新该行的 selectedBy 列
将行返回给客户端
如何防止客户在完全相同的时间选择同一行?
我尝试了各种表提示和隔离级别,但只是在客户端出现死锁异常。我只希望第二次调用等待几分之一秒,直到第一次调用完成。
【问题讨论】:
-
基本上你是using a table as a queue,但它真的需要随机,因为这大大增加了问题。
-
只要它看起来是相对随机的(即它不是连续的)就足够了。
-
使用
sp_getapplock序列化对存储过程的访问而不是尝试管理并发和避免死锁的解决方案怎么样? -
不熟悉,但看了 MSDN 之后,你的意思是我在我的客户端代码中调用它。即获取锁。如果成功执行sproc,否则等待并重试还是更自动?
-
您将它放在存储过程本身中,然后在代码末尾
sp_releaseapplock以序列化对该代码的访问。这意味着您不会遇到死锁,但可能会遇到等待和超时,这取决于代码运行所需的时间以及并发尝试发生的频率。
标签: sql-server sql-server-2008 locking deadlock isolation-level