我在ASP.NET MVC中使用EF 6。我在后台运行一些任务,所以我使用新的EF上下文和Task类来执行它。异步任务分为3个较小的任务,这些任务也应该在同一个DB事务中运行异步。我无法使用SaveAsync,因为我的代码是从同步和异步上下文调用的。
Task.Run(() =>
{
try
{
using (var transaction = dbContext.Database.BeginTransaction())
{
CalculateAmounts(id);
transaction.Commit();
}
}
finally
{
dbContext.Dispose();
}
});
方法CalculateAmounts是另外创建3个任务的方法。我该如何处理交易?
一方面,当任务一起工作时,我遇到了一些错误,比如DataReader已经打开了。我应该为每项任务创建一个上下文吗?在这种情况下,如何使它们成为同一交易的一部分?
答案 0 :(得分:3)
我担心你不能做你想做的事,这就是原因:
异步任务分为3个较小的任务,也应该运行 异步但在同一个数据库事务中
单个数据库连接一次只能运行1个事务。这意味着你需要3个并发连接。
您仍然可以distributed connection使用TransactionScope包裹这3个连接。问题是TransactionScope在任何不是它所启动的线程中都是不可见的。实际上,TS是线程静态的,ADO.NET会检查当前线程以确定它是否应该一起提交多个事务或滚动他们都回来了。无论如何,它不适合你。
从.NET 4.5.1开始,您可以选择将TransactionScopeAsyncFlowOption
传递给TransactionScope,但不会使其支持内部的多个线程。它只会支持async / await
。
TL; DR:你最好平行完成所有事情,然后以连续方式提交所有内容。