使API调用和数据库操作原子化

问题描述 投票:0回答:1

我想执行以下操作:

  • 开始交易
  • 将数据插入数据库
  • 插入后,使用新添加的行的主键将数据提交到API端点
  • 然后提交交易

如果插入失败,将不会执行任何操作,并且将回滚所有操作。问题是如果提交事务失败(因为它不是数据库操作),我没有很好的方法回滚API请求。我唯一想到的就是从端点删除数据。有没有更好的办法?我正在使用实体框架。谢谢。

c# entity-framework transactions entity-framework-6 atomic
1个回答
0
投票

因此,如果我已正确理解,则仅在API调用成功的情况下才想提交给DB,但是只有从数据库插入中获得数据库生成的主键后才能调用API。

因此这将导致一种两阶段提交类型的方法,但是如果插入成功,API调用成功但数据库提交失败会怎样? (如果发生!)

因此,我认为您应该考虑改为实现Saga设计模式。

这是针对复杂的分布式系统(尤其是使用微服务的系统)的设计,在这种情况下,您需要确保不同分布式系统之间的数据一致性。基本上,您建立了一种需要按顺序执行的交易链。然后,您一个接一个地检查它们,如果成功,则转到下一个。

但是,对于每笔交易,您都有一笔补偿性交易。这样一来,如果事务失败,那么您将逐个执行所有补偿事务,直到最后您拥有相同的初始状态。

有不同的方法,例如基于编排的传奇或基于编排的传奇。您可以在此处找到更多详细信息和更好的解释:https://microservices.io/patterns/data/saga.html

© www.soinside.com 2019 - 2024. All rights reserved.