SQL Server-锁定/阻止方案
我有一些文件处理功能,它使用数据库表来确定文件是否已被处理SQL Server-锁定/阻止方案,sql,sql-server,sql-server-2005,sql-server-2008,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 我想要的行为如下:- 一次只能有一个事务处理一个文件
IF EXISTS (SELECT * FROM FileTable WITH (UPDLOCK, ROWLOCK, HOLDLOCK)
WHERE FileName = @FileToProcess)
BEGIN
-- File already processed.
END
ELSE
BEGIN
-- Process file.
END
我想要的行为如下:-
- 一次只能有一个事务处理一个文件
- 同时处理不同的文件
- 如果在处理同一文件时尝试处理该文件,则该事务将被阻止,直到另一个事务完成
我缺少什么?尝试添加
readpass
以允许第2点
您可能对感兴趣。我以前也回答过类似的问题:。总之,您需要
行锁、readpass、UPDLOCK
提示才能将表用作队列
但是,不能使用DB引擎锁“阻止”同一文件,因为这意味着在处理文件时将事务保持打开状态。您可以做的是“标记”该文件,以便根据上面的链接,另一个进程以安全的并发方式跳过该文件
我还有其他答案可以帮助您可能的重复。不幸的是,readpass提示不能与HOLDLOCK提示一起使用,如果我删除HOLDLOCK提示,它将突破第3点。优秀文章。您可能希望在您的答案中进一步推广它。:)请看我的第2段:您想要的模式通常是一些客户机代码调用数据库,获取有关处理内容的信息,处理它,然后写回。你不让交易保持开放状态