我创建了一个系统,每天通过 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()
以确保其他计划进程不会再次读取它们(我的原因我设置日期时间标志而不是位标志是因为某些 SMS 发送可能会失败,这样我就可以了解哪些是很久以前阅读但未更新发送时间的)
在发送短信后标记它们(无论如何都应该这样做以写入发送时间)不会有帮助,因为将处理发送短信的计划任务将立即读取所有 1000 条记录,并且可能有已读取的记录由其他进程但尚未标记(因为 SMS 尚未发送)。
最佳答案
你应该能够做这样的事情:
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
关于c# - 如何标记在mssql中读取的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12332434/