TransactionScope中的TransactionScopeAsyncFlowOption.Enabled无法按预期工作

时间:2018-03-14 07:27:30

标签: asp.net asp.net-web-api transactionscope

我有一个场景,我在ASP.NET Web API上启用事务。在这种特殊情况下,我的Web API使用多个dbcontexts(因为我们正在处理多个数据库)。为此,我正在创建一个新的动作过滤器

准确地说,在Web API项目中,我在“OnActionExecutingAsync”方法中启动一个事务范围,然后在“OnActionExecutedAsync”动作过滤器方法中完成事务范围。

我观察到的是,当我使用TransactionScopeAsyncFlowOption.Enabled(根据async方案的要求)时,Transaction.Current在'OnActionExecutedAsync'方法中变为null。而在TransactionScopeAsyncFlowOption.Suppress的情况下,它保持不变,并且Web API中的所有数据库操作都按预期包装在事务中,但是当调用dispose时,我得到一个异常,即事务范围必须放在同一个线程上(这是正确的,如同根据我的理解,使用TransactionScopeAsyncFlowOption.Enabled以满足这种情况的重点。

有人可以解释为什么TransactionScopeAsyncFlowOption.Enabled以这种方式表现,或者我在这种方法中做错了吗?

1 个答案:

答案 0 :(得分:0)

检查以下文章
https://blogs.msdn.microsoft.com/pfxteam/2012/01/20/await-synchronizationcontext-and-console-apps/

这一个

  

正如我们在using块之外看到的,Transaction.Current属性为null。在使用块内部,Transaction.Current属性不为null。即使像SomeMethodInTheCallStack这样的调用堆栈中的方法也可以访问Transaction.Current,只要它包含在using块中。

https://particular.net/blog/transactionscope-and-async-await-be-one-with-the-flow