【问题标题】:Transaction Scope With API calls带有 API 调用的事务范围
【发布时间】:2018-02-16 04:23:15
【问题描述】:

我正在开发一个分布式进程,该进程依赖于一些内部数据库操作以及一些第三方 API。如果在任何时候发生错误,我想利用事务范围功能回滚。

这是我的流程的工作原理。

用户注册流程

  1. 使用 Dapper ORM 填充我们正在插入到我的数据库中的基本信息。
  2. 填写的信息有一半被传递给第三方 API。
  3. 如果 API 调用成功,用户将通过支付网关 API 注册到我们的支付系统。

现在是我担心的情况。假设 #1 和 #2 成功完成,而在执行 #3 时由于任何原因失败。在这种情况下,事务范围会恢复 #1 和 #2 吗?我对#1 很确定,但它也会为#2 处理吗?如果不是,我可以在这种情况下实施的替代解决方案是什么。

【问题讨论】:

  • 那么你在说什么样的 API 调用?图书馆电话或网络电话? WCF 支持具有某些传输的事务。 REST 不会
  • @MickyD 我想作为#3 对 Stripe 支付网关进行 REST API 调用。我只是希望该过程是防故障的,如果出于任何原因 Stripe API 返回错误 #1 和 #2 应该被还原。

标签: c# asp.net transactionscope


【解决方案1】:

你不能。您唯一可以实现的是,如果 API 调用失败,您可以回滚您的事务

您无法控制 API 发生的事情。

但这可以通过一些错误代码的相互理解来完成,比如如果我发回“错误”,这意味着我回滚了,你也回滚了

【讨论】:

    【解决方案2】:

    我认为这是您通常应该尽量避免的事情,即将 REST API 调用作为事务的一部分。但是,如果您仍然需要这样做,无论出于何种原因,您都需要自己实现事务协调器。

    在您的情况下,在 dapper insert 周围使用 transactionScope 并调用 API。如果出现问题,请向 API 中的不同方法发送新请求,以回滚您在事务中所做的一切。

    try {
            using (var ts = new TransactionScope())
            {
              // insert data using dapper
              // Do your API Call
              ts.Complete()
            }
       }
      catch(Exception)
      {
         // Rollback your API call. 
      }
    

    【讨论】:

    • 明白你的意思,这就是我想知道如果事务失败是否会恢复 API 调用。我想我将不得不手动处理这种情况。
    猜你喜欢
    • 1970-01-01
    • 2016-11-08
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 2013-11-23
    • 1970-01-01
    相关资源
    最近更新 更多