【问题标题】:Can we apply the transaction scope for entire API actions on 1 request我们可以将事务范围应用于 1 个请求的整个 API 操作吗
【发布时间】:2019-09-06 14:08:20
【问题描述】:

我正在使用 Web API 和 EntityFramework 6.2。调度程序将为每个 customerID 调用 API。对于一个请求,API 将执行 10 个操作。 现在任何一个操作都失败了,这 10 个操作应该针对该特定请求回滚。

【问题讨论】:

  • 事务范围处理数据库事务。它没有 HTTP 调用的概念。
  • 我的问题是对 1 个客户 ID 的 API 请求将执行 10 个不同的数据库操作。由于异常,一个操作失败,然后它应该恢复以前执行的操作
  • 问题错了。不仅仅是 10 个数据库操作,它们是 10 个不同的数据库连接,10 个不同的事务执行 10 个不同的命令。除非您实现分布式事务协议,否则无法在同一事务下获得 10 个不同的 HTTP 调用。在 SOAP 时代,这并没有什么不同。当时的例外是分布式事务的标准,它不能扩展。 REST 没有这样的标准
  • 我强烈建议您阅读Distributed transactions aren’t, and microservices still don’t mix。它准确地涵盖了您的问题并解释了错误的原因。
  • 如果您希望在收到所有请求后才完成一批请求,您必须自己实现这一点 - 将请求存储在一些临时存储中,并且仅在最终请求到达。这意味着您需要添加一个名为 Start batch 的调用,这是一种关联所有操作(通常使用批处理 ID)和最终 Finish Batch 调用的方法。

标签: c# entity-framework linq asp.net-web-api


【解决方案1】:

如果你有一个单一的控制器方法,它需要一个客户ID 列表,这是微不足道的。只需调用如下方法:

static void DoStuffToCustomers(List<int> customerIds)
{
    using (var db = new Db())
    using (var tran = db.Database.BeginTransaction())
    {
        foreach (var id in customerIds)
        {
            db.DoStuffToCustomer(id);
        }
        db.SaveChanges();
        tran.Commit();
    }
}

如果您有 10 个单独的 HTTP 请求,甚至不建议尝试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-23
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    相关资源
    最近更新 更多