我编写了一个处理文件的应用程序。所以,我有一个表,其中包含有关在应用程序中注册的所有文件的信息。
我的“文件”表格如下所示: ID ,路径和 LastScanTime 。
我在我的应用程序中使用的算法很简单:
到目前为止,任务非常简单。为此,我将使用此SQL语句来获取最旧的项目:
SELECT TOP 1 * FROM files ORDER BY [LastScanTime] ASC
并在项目处理结束时(防止再次立即选择项目):
UPDATE Files SET [LastScanTime]=GETDATE() WHERE Id=@ItemID
现在,我将为算法添加一些复杂性:
对于每一行,请执行:
一个。提取文件路径
B.在这个文件上做一些魔法(需要5分钟)
C.将LastScanTime更新为当前时间(现在)
D.转到步骤“1”
现在我面临的问题是整个过程将并行处理(不再需要串行处理)。因此,将我的SQL语句更改为下一个语句是不够的!
SELECT TOP 3 * FROM files ORDER BY [LastScanTime] ASC
假设我运行我的代码并开始执行前3项。现在,一分钟后我想再执行3项。此SQL语句将检索与我们已开始处理的完全相同的“最旧”项。
实施SELECT&更新(合并)获取3个最旧的项目并立即更新其上次扫描时间。既然没有SELECT&在同一语句中UPDATE,如果在执行第一个SELECT之间会发生什么,将会出现在另一个SELECT中?这两个语句将得到相同的结果。这是一个问题......另一个问题是我们在扫描完成之前将项目标记为“最近扫描”。如果扫描因错误而终止会发生什么?
我正在寻找解决此问题的提示和技巧。解决方案可以根据需要添加列。
我将感激你的帮助。
答案 0 :(得分:0)
我通常习惯在数据库中有两个不同的字段名称。一个是AddedDate,另一个是ModifiedDate。 因此,您的术语中的算法将是: -
答案 1 :(得分:0)
您似乎要使用SQL创建事件队列。可能像RabbitMQ或ActiveMQ这样的标准方法可以解决您的问题。