【问题标题】:Make API call and database operations atomic使 API 调用和数据库操作原子化
【发布时间】:2020-04-07 07:19:46
【问题描述】:

我想做以下事情:

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

如果插入失败,什么都不会做,一切都会回滚。问题是如果事务提交失败,我没有回滚 API 请求的好方法,因为它不是数据库操作。我唯一能想到的就是从端点删除数据。有没有更好的办法?我正在使用实体框架。谢谢。

【问题讨论】:

  • 使用 EF 保存更改后将数据提交到 API 端点。
  • @Sir Rufo 是的。问题是当提交到数据端点失败时,我需要回滚数据库,如果我保存更改就不能再这样做了。
  • 你有行的键,所以如果 API 调用失败,你可以删除它们
  • @SirRufo 如果调用 API 的服务在发现(捕获异常)API 调用失败后立即失败怎么办?

标签: c# entity-framework transactions entity-framework-6 atomic


【解决方案1】:

因此,如果我理解正确,您只想在 API 调用成功的情况下提交到数据库,但在您从数据库插入中获得数据库生成的主键之前无法调用 API。

所以这会导致一种 2 阶段提交类型的方法,但是如果插入成功,API 调用成功,但 DB 提交失败,会发生什么? (如果发生!)

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

这是为复杂的分布式系统设计的,尤其是使用微服务时,您需要确保跨不同分布式系统的数据一致性。 基本上,您构建了一种需要按顺序执行的交易链。然后你一个一个地检查它们,如果成功,你就会进入下一个。

但是,对于每笔交易,您还有一笔补偿交易。因此,如果事务失败,那么您将通过列表向后工作,一一执行所有补偿事务,直到最后您具有相同的初始状态。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-03
    • 1970-01-01
    • 2012-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-26
    • 1970-01-01
    相关资源
    最近更新 更多