c# - 如何标记在mssql中读取的记录

标签 c# asp.net sql-server tsql

我创建了一个系统,每天通过 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/

相关文章:

SQL过滤日期抓取列并让它抓取前10天的记录

c# - 在 ASP.NET Core 中流式传输内存中生成的文件

c# - 以ajax方式将项目添加到列表框

c# - ASP.NET MVC中如何实现基于Session数据的授权检查?

asp.net - 如何在 Asp.net 中上传照片并保存其纵横比

.net - 如何对 . .NET 中的 resx(资源文件)

c# sql 返回没有时间的日期

c# - 当我想要同名控件时如何处理 "FindControl requires that controls have unique IDs"?

c# - 如何使用 ContentPushStream 在 C# 中播放 block 音频?

sql-server - Swift 只打印我的 sql server 查询结果的第一个字符