首页 > 解决方案 > DbContext.BeginTransactionAsync 有时需要几秒钟才能完成

问题描述

使用 EF Core 3.1,我们在调用BeginTransactionAsync().

代码是这样实现的: 代码示例1

像这样实现 BeginTransaction: 代码示例2

大多数情况下需要 1-4 毫秒,但时不时地需要更长的时间: 日志输出

上面的例子显示了刚刚超过 1 秒,但我看到的数字高达 15 秒。

我们的数据库是高级层中的 Azure Elasic 池。整个池的最大 CPU 使用率不超过 60%,eDTU 使用率也不超过,因此显然这不是 CPU 问题。这可能是什么原因造成的?

它似乎没有在任何特定时间间隔内发生,并且该问题出现在弹性池中的所有数据库中。(这是一个多租户应用程序,每个租户都有一个数据库)。当在 05:55:18.745 所见的同一时刻(或非常接近)创建多个事务时,似乎会发生此问题,但在其他时间它工作得很好,如 05:55:15.704 所见

是否BeginTransactionAsync()会导致数据库中的任何形式的锁定?

我们的应用使用 linux 容器在 Azure 应用服务中运行。该数据库与我们的容器位于同一天蓝色区域。

标签: .net-coreentity-framework-coretransactionsazure-sql-database

解决方案


因为调用了线程池,所以似乎有一些滞后,但它比 .NET Framework 实现快大约 3 倍。

原始答案的结果使用最新版本的 EF (6.4.0) 和 .NET Framework (4.7.2)。

当表中存在 binary(max) 列并对其执行异步调用时。Ado.Net 方面存在生成太多任务的问题,这会减慢进程。EF 的问题在于它没有正确使用 Ado.Net。

为什么不一起使用 EntityFramework 和 .NET Transactions?

可以使用事务以原子方式执行多个数据库操作。如果事务提交,则所有操作都成功应用于数据库。如果事务回滚,则不会对数据库应用任何操作。

这是来自 GitHub的原始帖子,很有帮助:使用多个联接时由于 3.0 中的更改而导致的显着查询速度下降


推荐阅读