C# sql server的服务冗余

C# sql server的服务冗余,c#,sql-server,linq-to-sql,microservices,event-driven,C#,Sql Server,Linq To Sql,Microservices,Event Driven,我有两个相同服务的实例在不同的机器上运行。这是为了确保高可用性(如果一台机器发生故障,导致第一个服务中断,那么第二个服务仍然可用) 触发总线事件时,这两个服务同时更新和删除SQL Server表中的相同行。因此,我通常会在总线事件上得到一个LinqToSqlChangeConflictException 为了处理这个问题,我目前使用了try catch来包围SubmitChanges,在ChangeConflictException的情况下不做任何事情 有没有更干净的办法 是否可以使用Linq

我有两个相同服务的实例在不同的机器上运行。这是为了确保高可用性(如果一台机器发生故障,导致第一个服务中断,那么第二个服务仍然可用)

触发总线事件时,这两个服务同时更新和删除SQL Server表中的相同行。因此,我通常会在总线事件上得到一个LinqToSql
ChangeConflictException

为了处理这个问题,我目前使用了
try catch
来包围
SubmitChanges
,在
ChangeConflictException
的情况下不做任何事情

有没有更干净的办法


是否可以使用Linq to SQL锁定整个表?(这样,其中一个服务将在尝试执行更新之前等待释放锁)。

我的这种锁定方法是使用分布式锁,而不是锁定目标表本身。如果有的话,它将允许您在流程中包含更多的逻辑。您不能使用标准的c#lock方法,因为同一个应用程序的多个实例需要共享同一个锁,所以您必须使用集中的方法

我以前使用过SQL Server,您只需要一个SQL数据库,每个应用程序实例都可以访问该数据库。您可以手动调用此SP,或者我知道有一些nuget软件包将此过程包装起来,使其更易于与集成。但是,如果您的解决方案中涉及到任何缓存解决方案,那么您也可以选择对其他缓存解决方案以及可能的大多数缓存解决方案执行相同的操作

基本上,您可以对任何要防止并发运行的操作使用新锁。在您的情况下,这将避免同时运行对该表的多个更新


正如你所说的,你也可以考虑一下这些事件是如何被提升和处理的,看看你是否能获得你在那个层次上寻找的弹性。在我脑海中,类似(和其他消息队列)的东西允许在消息传递级别处理许多失败情况。我不知道这是否也值得研究(如果有的话,如果这些事件只需要处理一次,可能会避免多次处理),但检查一下这一点可能会有所帮助。

创建一个单独的表。把桌子锁上。运行原始代码。释放表锁。如何使用linqtosql锁定表?谢谢;这很有趣。但是,这是t-sql,而不是直接使用linqtosql。我试图避免这种情况(还有存储过程),如果您希望锁定表,也可以使用
serializable
。但这可能会产生一大堆其他问题。