我们可以将事务范围应用于 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 中增加每秒事务限制?