我们在将同步调用转换为异步时引入了代码中的错误。从本质上讲,我们对基础设施(MSMQ)的异步调用尚未等待。我们看到了问题,并知道如何解决它。
皱纹是这个调用发生在TransactionScope / Distributed Transaction中。在调用scope.Complete()之前没有等待动作的情况下,我不清楚基础结构实际上在做什么。
交易是否永远不会升级为分布式交易?异步语句是否在单独的线程上执行,因此不参与环境事务?
using (var scope = new TransactionScope())
{
_someService.PerformDatabaseAction(SomeType someType);
//this call is async, but we don't await it
_someOtherService.WriteToMsmqAsync(SomeOtherType someOtherType);
scope.Complete();
}
我相信如果第二个语句被登记并且调用了scope.Complete(),那么事务将回滚,因为事务中的所有参与者还没有准备好提交?