【问题标题】:how to mark records that are read in mssql如何标记在mssql中读取的记录
【发布时间】:2012-09-08 16:23:18
【问题描述】:

我创建了一个系统,每天通过 SMS 向我们的客户发送一些信息。因为发送 SMS 的过程可能需要一段时间,这是由多个进程完成的,每个进程发送有限数量的 SMS。当一个进程读取许多 pohne nubers 的记录(比如说 1000 个)来发送短信时。我想标记这 1000 条记录,其他进程也不会读取这些记录。

Select Top(1000) ID, Number from Phones where isactive = 1 and isverified = 1

我需要一些代码来做这样的事情:

update Phones, set ReadTime = getdate() where(以上选择)

现在我想将这些记录的ReadTime 列更新为getdate(),以确保其他调度进程不会再次读取它们(我设置日期时间标志而不是位标志的原因是一些短信发送可能会失败,这样我就可以知道哪些是很久以前读取的,但没有更新发送时间)

在发送短信后标记它们(无论如何都应该这样做以写入发送时间)将无济于事,因为将处理发送短信的预定任务将一次读取所有 1000 条记录,并且可能会读取记录由其他进程但尚未标记(因为尚未发送 SMS)。

【问题讨论】:

    标签: c# asp.net sql-server tsql


    【解决方案1】:

    你应该可以做这样的事情:

    UPDATE Phones
    SET ReadTime = GetDate()
    WHERE ID IN (SELECT Top 1000 ID
                 FROM Phones
                 WHERE IsActive = 1
                     AND IsVerified = 1
                     AND ReadTime Is Null -- you will want to exclude any records already updated
                 ORDER BY ID) 
    

    SQL Fiddle with Demo

    【讨论】:

    • 如何确保所选行与您更新的行相同?
    • @t-clausen.dk 实际上它确实会更新相同的记录,如果添加了一个过滤器以包含日期,它会按预期工作。
    • 您正在更新 1000 行,但是这 1000 行不一定与问题中选择的行相同。所以你的查询是错误的
    【解决方案2】:

    您可以在表中添加一个额外的列,该列采用进程 ID 的 id。 然后你可以在每个进程中调用:

    UPDATE Phones
    SET ReadTime = GetDate(),
    ProcessId = "Process0001" --or whatever the process ID is
    WHERE ID IN (SELECT Top 1000 ID FROM Phones WHERE IsActive = 1 AND IsVerified = 1
                     AND ProcessId IS NULL AND ReadTime IS NULL) 
    

    然后您使用您的进程 ID 调用所有记录。最后,您从表中删除进程 ID。

    【讨论】:

      【解决方案3】:

      您可以一次选择并输出行。这将确保选择的行与更新的行相同,选择的答案会失败。​​

      ;with a
      as
      (
      select top 1000 readtime, id, number from @phones 
      where isactive = 1 and isverified = 1 
      and readtime is null
      )
      update a
      set Readtime = getdate()
      output deleted.ID, deleted.Number
      

      【讨论】:

      • 这一行readtime < datediff(day, 0, getdate()) 将导致所有记录再次更新为新的readtime
      • @bluefeet 是的,我误解了有关读取时间的部分,现在更改了该部分。
      猜你喜欢
      • 1970-01-01
      • 2023-03-23
      • 2023-01-07
      • 1970-01-01
      • 2021-04-21
      • 1970-01-01
      • 2013-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多