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

C# 防止多个线程/实例选择和处理Azure SQL数据库中的相同行,c#,asp.net,sql-server,entity-framework,azure,C#,Asp.net,Sql Server,Entity Framework,Azure,关于如何防止应用程序和/或线程的多个实例在MSSQL表中选择相同的行,我有一个问题 这是一个场景: 我有一个ASP.net网站,用户可以在其中输入他们的电子邮件。 然后,电子邮件将插入我的MSSQL数据库中的一个表中 然后,我们的想法是创建一个WebJob(Azure WebJob),每五秒钟选择一次所有新创建的行,然后向每个用户发送一封电子邮件,然后将该行标记为“已处理” 然而。。 如果我出于某种原因决定将我的WebJob扩展到多个实例呢?。。 我假设可能有一个smal窗口,其中多个实例可以选

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

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

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

然而。。 如果我出于某种原因决定将我的WebJob扩展到多个实例呢?。。 我假设可能有一个smal窗口,其中多个实例可以选择数据库中的相同行,然后处理这些行并向注册用户发送多封电子邮件? 是否有某种方式可以通过另一个实例/线程对当前正在处理的行进行排序“锁定”

还是我走错了路

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


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

我宁愿将邮件发送与插入数据库等集成到同一个过程中,您可以使用一个存储过程将新记录插入数据库,然后使用sp_send_dbmail发送邮件

您还可以使用SQL依赖关系。如果在SQL Server中启用代理并使用SQL依赖关系,则对数据库的任何更改都将推送到应用程序中。SQL依赖关系非常容易使用,只需在谷歌上搜索一下,您就会发现许多教程

在这两种解决方案中,您不需要连续轮询数据库

如果必须使用webjobs,则可以使用
序列化
隔离级别将代码包装在
TransactionScope
中。这将防止多个实例出现问题

using(TransactionScope scope = new TransactionScope())
 {
      /* Perform transactional work here */
      SomeMethod();
      scope.Complete();
 }

我相信在使用TransactionScope时,默认情况下隔离级别设置为可序列化。

请查看。我认为这比使用SQL数据库更好。您好,是的,使用相同的线程/实例直接发送电子邮件会很有意义,但是系统当前的体系结构要求电子邮件“排队”。此外,由于应用程序和数据库将托管在Azure中(Web应用程序、WebJob和Azure SQL),因此我将无法使用SQL依赖项。。很抱歉,我错过了一个指导性的主题。。我将从MSSQL更改为Azure SQL。