SQL Server - 锁定/阻止方案

时间:2011-12-09 10:33:43

标签: sql sql-server sql-server-2005 sql-server-2008

我有一些文件处理功能,它使用数据库表来确定文件是否已被处理。

IF EXISTS (SELECT * FROM FileTable WITH (UPDLOCK, ROWLOCK, HOLDLOCK) 
           WHERE FileName = @FileToProcess)
BEGIN
    -- File already processed.
END
ELSE
BEGIN
    -- Process file.
END

我想要的行为如下: -

  • 一次只能处理一个文件。
  • 同时处理不同的文件。
  • 如果在处理同一文件时尝试处理该文件,则该事务将一直阻塞,直到另一个文件完成。

我很确定这是可能的,但我的SQL锁定知识还不是很好!到目前为止,我的尝试要么包括上面示例中的锁定提示,这会使子弹点2失败。我尝试过的所有其他锁定提示都导致子弹点3失败。

我错过了什么?

2 个答案:

答案 0 :(得分:2)

我之前回答过类似的问题:SQL Server Process Queue Race Condition。总之,您需要ROWLOCK, READPAST, UPDLOCK提示才能将表用作队列。

但是,您无法使用数据库引擎锁定“阻止”同一文件,因为这意味着在处理文件时保持事务处于打开状态。您可以做的是“标记”该文件,以便按照上面的链接以安全的并发方式跳过另一个进程

我还有其他答案可以帮助你https://stackoverflow.com/search?tab=votes&q=user%3a27535%20readpast

答案 1 :(得分:0)

尝试添加READPAST以允许第2点。

您可能对this article

感兴趣