C# 确保不同.NET核心服务之间的原子性

C# 确保不同.NET核心服务之间的原子性,c#,algorithm,asp.net-core,.net-core,transactions,C#,Algorithm,Asp.net Core,.net Core,Transactions,由于.NETCore还不支持分布式事务(),因此我正试图想出一种方法来确保应用程序中某个流的原子性 流程如下: A向B发送请求 B处理请求并将其存储在其数据库中 B返回一个响应,指示请求已成功处理 A将来自B的响应存储在其数据库中 这里可能出现的问题是,在将响应存储在数据库中之前,A的进程可能会被终止,这将导致数据存储在B中而不是A中,这是我想要避免的 我想不出一个非常简单的方法来解决这个问题。我的最佳选择可能是在“A”中引入一些额外的清理逻辑,但我想知道是否有更简单、更智能的方法来实现这一

由于.NETCore还不支持分布式事务(),因此我正试图想出一种方法来确保应用程序中某个流的原子性

流程如下:

  • A向B发送请求
  • B处理请求并将其存储在其数据库中
  • B返回一个响应,指示请求已成功处理
  • A将来自B的响应存储在其数据库中
这里可能出现的问题是,在将响应存储在数据库中之前,A的进程可能会被终止,这将导致数据存储在B中而不是A中,这是我想要避免的


我想不出一个非常简单的方法来解决这个问题。我的最佳选择可能是在“A”中引入一些额外的清理逻辑,但我想知道是否有更简单、更智能的方法来实现这一点。

您可以使用异步流程并保证交付。IE A向B发送保证传递请求。B执行某些操作并向A发送保证传递响应。这可以通过消息传递系统(Azure Service Bus、RabbitMQ等)实现,也可以通过简单地使用每个应用的本地数据库作为消息的出站队列来实现。因此A不直接向B发送请求,A将请求保存在其数据库中,一些后台进程最终调用B。然后B对响应执行相同的操作

您还可以通过“协调”数据库事务来实现这一点。IE A启动事务T1并写入B的数据库。A启动第二个事务T2并将响应写入A的数据库。如果两次写入都成功,A将记录来自B的响应,然后快速连续提交T1和T2。如果T1提交而T2未能提交,则A将记录失败,并需要操作干预


这本质上就是分布式事务的工作方式。即使是“真正的”分布式事务,其中一个参与者也有很小的可能无法提交。

您可以使用保证交付的异步流程。IE A向B发送保证传递请求。B执行某些操作并向A发送保证传递响应。这可以通过消息传递系统(Azure Service Bus、RabbitMQ等)实现,也可以通过简单地使用每个应用的本地数据库作为消息的出站队列来实现。因此A不直接向B发送请求,A将请求保存在其数据库中,一些后台进程最终调用B。然后B对响应执行相同的操作

您还可以通过“协调”数据库事务来实现这一点。IE A启动事务T1并写入B的数据库。A启动第二个事务T2并将响应写入A的数据库。如果两次写入都成功,A将记录来自B的响应,然后快速连续提交T1和T2。如果T1提交而T2未能提交,则A将记录失败,并需要操作干预

这本质上就是分布式事务的工作方式。即使是“真正的”分布式事务,其中一个参与者也有可能无法提交