我有一些文件处理功能,它使用数据库表来确定文件是否已被处理。
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失败。
我错过了什么?
答案 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
感兴趣