使 API 调用和数据库操作原子化
Make API call and database operations atomic
我想执行以下操作:
- 开始交易
- 将数据插入数据库
- 插入后,使用新添加的行的主键
将数据提交到API端点
- 然后提交事务
如果插入失败,什么都不做,一切都被回滚。问题是如果事务提交失败,我没有好的方法来回滚 API 请求,因为它不是数据库操作。我唯一能想到的就是从端点删除数据。有没有更好的办法?我正在使用 entity framework。谢谢
所以如果我没理解错的话,你只想在 API 调用成功时提交给数据库,但在数据库生成主键之前不能调用 API从数据库插入。
所以这会导致一种 2 阶段提交类型的方法,但是如果插入成功,API 调用成功,但数据库提交失败会怎样? (如果发生的话!)
因此,我认为您应该考虑改为实施 Saga 设计模式。
这是为复杂的分布式系统设计的,尤其是使用微服务的时候,需要保证跨不同分布式系统的数据一致性。
基本上你建立了一种需要按顺序执行的交易链。然后你一个一个地检查它们,如果成功,你就进入下一个。
但是,对于每笔交易,您还有一笔补偿交易。因此,如果交易失败,那么您可以通过列表向后工作,一个接一个地执行所有补偿交易,直到最后您拥有相同的初始状态。
有不同的方法可以做到这一点,例如基于 Choreography 的 saga 或基于 Orchestration 的 saga。
您可以在此处找到更多详细信息和更好的解释:
https://microservices.io/patterns/data/saga.html
我想执行以下操作:
- 开始交易
- 将数据插入数据库
- 插入后,使用新添加的行的主键 将数据提交到API端点
- 然后提交事务
如果插入失败,什么都不做,一切都被回滚。问题是如果事务提交失败,我没有好的方法来回滚 API 请求,因为它不是数据库操作。我唯一能想到的就是从端点删除数据。有没有更好的办法?我正在使用 entity framework。谢谢
所以如果我没理解错的话,你只想在 API 调用成功时提交给数据库,但在数据库生成主键之前不能调用 API从数据库插入。
所以这会导致一种 2 阶段提交类型的方法,但是如果插入成功,API 调用成功,但数据库提交失败会怎样? (如果发生的话!)
因此,我认为您应该考虑改为实施 Saga 设计模式。
这是为复杂的分布式系统设计的,尤其是使用微服务的时候,需要保证跨不同分布式系统的数据一致性。 基本上你建立了一种需要按顺序执行的交易链。然后你一个一个地检查它们,如果成功,你就进入下一个。
但是,对于每笔交易,您还有一笔补偿交易。因此,如果交易失败,那么您可以通过列表向后工作,一个接一个地执行所有补偿交易,直到最后您拥有相同的初始状态。
有不同的方法可以做到这一点,例如基于 Choreography 的 saga 或基于 Orchestration 的 saga。 您可以在此处找到更多详细信息和更好的解释: https://microservices.io/patterns/data/saga.html