作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我们的代码库中,我们广泛使用 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
并将启动事务。 ExecuteSqlRawAsync
和 SaveChangesAsync
都将在该事务内运行并一起完成或回滚(我确认了这一点)。
关于“不开始交易”的评论更多的是针对以下情况:
ExecuteSqlRawAsync("delete from sometable where id = 1;delete from sometable where id = 2;");
您确实可能希望在事务中运行 sql(假设事务尚不存在),因此文档警告您它不会为您执行此操作。
关于c# - 如何在 TransactionScope 的流程中显式启动事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74093528/
我是一名优秀的程序员,十分优秀!