gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 18:02:15 26 4
gpt4 key购买 nike

在我们的代码库中,我们广泛使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com