我们可以将事务范围应用于 1 个请求的整个 API 操作吗

Posted

技术标签:

【中文标题】我们可以将事务范围应用于 1 个请求的整个 API 操作吗【英文标题】:Can we apply the transaction scope for entire API actions on 1 request 【发布时间】: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 调用的方法。 【参考方案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 请求,甚至不建议尝试。

【讨论】:

以上是关于我们可以将事务范围应用于 1 个请求的整个 API 操作吗的主要内容,如果未能解决你的问题,请参考以下文章

如何在 microsoft face api 中增加每秒事务限制?

Dynamics CRM 2015/2016/365 Web API:批处理任务

VBA If 语句将 Vlookup 应用于整个范围

Domain Logic approaches

Domain Logic approaches

Instagram API:范围是不是适用于 OAuth2 隐式身份验证流程?