从表中获取最旧的行

时间:2015-12-01 09:40:20

标签: sql sql-server

我编写了一个处理文件的应用程序。所以,我有一个表,其中包含有关在应用程序中注册的所有文件的信息。

我的“文件”表格如下所示: ID 路径 LastScanTime

我在我的应用程序中使用的算法很简单:

  1. 取最旧的行(LastScanTime是最早的行)
  2. 提取文件路径
  3. 在这个档案上做一些魔术(需要5分钟)
  4. 将LastScanTime更新为当前时间(现在)
  5. 转到步骤“1”
  6. 到目前为止,任务非常简单。为此,我将使用此SQL语句来获取最旧的项目:

    SELECT TOP 1 * FROM files ORDER BY [LastScanTime] ASC
    

    并在项目处理结束时(防止再次立即选择项目):

    UPDATE Files SET [LastScanTime]=GETDATE() WHERE Id=@ItemID
    

    现在,我将为算法添加一些复杂性:

    1. 取最旧的3行(LastScanTime是最早的行)
    2. 对于每一行,请执行:

      一个。提取文件路径
      B.在这个文件上做一些魔法(需要5分钟)
      C.将LastScanTime更新为当前时间(现在)
      D.转到步骤“1”

    3. 现在我面临的问题是整个过程将并行处理(不再需要串行处理)。因此,将我的SQL语句更改为下一个语句是不够的!

      SELECT TOP 3 * FROM files ORDER BY [LastScanTime] ASC
      

      为什么这个SQL语句不够用?

      假设我运行我的代码并开始执行前3项。现在,一分钟后我想再执行3项。此SQL语句将检索与我们已开始处理的完全相同的“最旧”项。

      可能的解决方案

      实施SELECT&更新(合并)获取3个最旧的项目并立即更新其上次扫描时间。既然没有SELECT&在同一语句中UPDATE,如果在执行第一个SELECT之间会发生什么,将会出现在另一个SELECT中?这两个语句将得到相同的结果。这是一个问题......另一个问题是我们在扫描完成之前将项目标记为“最近扫描”。如果扫描因错误而终止会发生什么?

      我正在寻找解决此问题的提示和技巧。解决方案可以根据需要添加列。

      我将感激你的帮助。

2 个答案:

答案 0 :(得分:0)

我通常习惯在数据库中有两个不同的字段名称。一个是AddedDate,另一个是ModifiedDate。 因此,您的术语中的算法将是: -

  1. 取最旧的行(AddedDate是最早的行)
  2. 提取文件路径
  3. 对此文件执行某些操作
  4. 将ModifiedDate更新为当前时间(现在)

答案 1 :(得分:0)

您似乎要使用SQL创建事件队列。可能像RabbitMQ或ActiveMQ这样的标准方法可以解决您的问题。

相关问题