Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# &引用;火与遗忘”;异步内部分布式事务_C#_Sql Server_Transactions_Msdtc - Fatal编程技术网

C# &引用;火与遗忘”;异步内部分布式事务

C# &引用;火与遗忘”;异步内部分布式事务,c#,sql-server,transactions,msdtc,C#,Sql Server,Transactions,Msdtc,我们在代码中发现了一个bug,它是在将同步调用转换为异步调用时引入的。从本质上讲,我们有一个对基础设施(MSMQ)的异步调用,它没有被等待。我们看到了问题,知道如何解决它 问题在于此调用发生在TransactionScope/分布式事务内部。在调用scope.Complete()之前没有等待操作的情况下,我不清楚基础结构实际上在做什么 事务是否从未升级为分布式事务?异步语句是否在单独的线程上执行,因此不参与环境事务 using (var scope = new Transacti

我们在代码中发现了一个bug,它是在将同步调用转换为异步调用时引入的。从本质上讲,我们有一个对基础设施(MSMQ)的异步调用,它没有被等待。我们看到了问题,知道如何解决它

问题在于此调用发生在TransactionScope/分布式事务内部。在调用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(),事务将回滚,因为事务中的所有参与者还没有准备好提交?

您知道TransactionScopeAsyncFlowOption吗?因为在你的示例代码中你没有使用它,所以即使等待也不能解决问题。是的,谢谢,尽管我在开始研究这个问题之前没有意识到。所以。这实际上可能就是答案。如果TransactionScopeAsyncFlowOption与所示的代码一起使用,会发生什么情况?我有一种感觉,它可能取决于WriteToMsmqAsync的实现,也许您可以显示它?因为这里有竞态条件,我想说的是,如果事务能够及时登记,那么整个分布式事务将失败,或者范围将等待第二个事务提交/失败(在范围超时范围内)。这需要测试,因为我没有找到任何信息。若第二个函数并没有登记到作用域中,它将独立于作用域完成。您知道TransactionScopeAsyncFlowOption吗?因为在你的示例代码中你没有使用它,所以即使等待也不能解决问题。是的,谢谢,尽管我在开始研究这个问题之前没有意识到。所以。这实际上可能就是答案。如果TransactionScopeAsyncFlowOption与所示的代码一起使用,会发生什么情况?我有一种感觉,它可能取决于WriteToMsmqAsync的实现,也许您可以显示它?因为这里有竞态条件,我想说的是,如果事务能够及时登记,那么整个分布式事务将失败,或者范围将等待第二个事务提交/失败(在范围超时范围内)。这需要测试,因为我没有找到任何信息。若第二个函数并没有登记到作用域中,它将独立于作用域完成。