c# - 防止多个线程/实例选择和处理 Azure SQL 数据库中的相同行

标签 c# asp.net sql-server entity-framework azure

我有一个关于如何防止应用程序和/或线程的多个实例选择 MSSQL 表中的相同行的问题。

这是场景: 我有一个 ASP.net 站点,用户可以在其中输入他们的电子邮件。 然后,该电子邮件将被插入到我的 MSSQL 数据库内的表中。

然后的想法是让 WebJob(Azure WebJob)每五秒选择一次所有新创建的行,然后向每个用户发送一封电子邮件,然后将该行标记为“已处理”..

但是.. 如果我出于某种原因决定将我的 WebJob 扩展到多个实例怎么办?.. 我假设可能有一个小窗口,其中多个实例可能会选择数据库中的相同行,然后处理这些行并向注册用户发送多封电子邮件? 是否有某种方法可以“锁定”另一个实例/线程当前正在处理的行?

或者我是否以错误的方式处理这个问题?

兄弟, 指数

最佳答案

无法对 ASP.Net 发表评论,因为我已经很久没有用它做过任何事情了。但对于 SQL Server,您应该查看数据队列示例。下面的链接是一个很好的起点:

https://www.mssqltips.com/sqlservertip/1257/processing-data-queues-in-sql-server-with-readpast-and-updlock/

您可以使用查询提示(即链接中的 UPDLOCK、READPAST)和约束(强制唯一性等)来确保没有两个线程可以读取或写入相同的数据。

关于c# - 防止多个线程/实例选择和处理 Azure SQL 数据库中的相同行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36005345/

相关文章:

C# SQL Server Coonnectivity - 持续连接(客户端 - 服务器

c# - 在 ASP.NET MVC 3 中添加 header

c# - 从 Gridview 访问选定的绑定(bind)字段值

c# - 线程并发数据库查询是否安全?

c# - 如何在服务器上发送邮件时在客户端显示已发送邮件的数量?

asp.net - 尝试自动附加到远程 Web 服务器时出现意外的 DCOM 错误

sql - 在所有数据库中搜索值

sql-server - 在 SQL Server 中,如何在发生错误的触发器中查找行号?

sql - 从一张表中获取交叉数据的最佳方法是什么?

c# - 在 C# 中解密 PKCS#7 加密数据