c# - 如何在 TransactionScope 的流程中显式启动事务?

标签 c# entity-framework-core

在我们的代码库中,我们广泛使用 TransactionScope 来管理我们的事务。我们的代码库的一部分中的代码可能如下所示:

// options declared elsewhere
using var transactionScope = new TransactionScope(TransactionScopeOption.Required, transactionScopeOptions, TransactionScopeAsyncFlowOption.Enabled);

await _repository.DeleteAll(cancellationToken);

// do more stuff, that might trigger a call to SaveChangesAsync somewhere

transactionScope.Complete()

然后,在我们的存储库实现中,我们可能会有如下所示的内容:

public async Task DeleteAll(CancellationToken cancellationToken)
{
    // This may not even be necessary
    if (_dbContext.Database.GetDbConnection().State != ConnectionState.Open)
    {
        await _dbContext.Database.OpenConnectionAsync(cancellationToken);
    }

    await _dbContext.Database.ExecuteSqlRawAsync("DELETE FROM ThatTable", cancellationToken);
}

ExecuteSqlRawAsync 的文档指出该方法不会启动任何事务。这引出了我的问题:启动事务并将其纳入事务范围的正确方法是什么,以便对 Complete 的调用将提交此事务以及我们让 EF 执行的其他工作?

最佳答案

据我了解,您的目标是在同一事务中运行 DeleteAll(使用 ExecuteSqlRawAsync)和潜在的后续 SaveChangesAsync。如果是这样 - 您的代码已经实现了这一点。

是的,ExecuteSqlRawAsync 不会启动单独的事务,但您不需要另一个事务,您已经在事务内,因为您在 TransactionScope 内。 SqlClient(或您使用的任何其他 EF 提供程序)将注意到在打开连接时存在 abmient Transaction.Current 并将启动事务。 ExecuteSqlRawAsyncSaveChangesAsync 都将在该事务内运行并一起完成或回滚(我确认了这一点)。

关于“不开始交易”的评论更多的是针对以下情况:

ExecuteSqlRawAsync("delete from sometable where id = 1;delete from sometable where id = 2;");

您确实可能希望在事务中运行 sql(假设事务尚不存在),因此文档警告您它不会为您执行此操作。

关于c# - 如何在 TransactionScope 的流程中显式启动事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74093528/

相关文章:

c# - 什么 NuGet 包包含 DotNet Core 的 OptimisticConcurrencyException?

c# - ASP.NET Core InvalidOperationException : Unable to resolve service for type DbContext while attempting to activate UserStore

c# - 正则表达式 - 只捕获旁边没有字母的数字

c# - Lucene 带有过滤器的空查询字符串

c# - 仅当上下文使用关系数据库提供程序时才能使用特定于关系的方法?

asp.net-core - EF Core 迁移错误 : "Unable to create an object of type ' ApplicationContext'"

C# 需要获取记录 >= 今天 LINQ

C#上传视频到Youtube,不提示用户登录: Youtube API V3

c# - 如何在 sql azure 上运行 aspnet_regsql?

c# - SqlException : Cannot insert explicit value for identity column in table 'Tasks' when IDENTITY_INSERT is set to OFF