TransactionScope不使用Parallel Extensions?

cod*_*fun 6 .net transactionscope parallel-extensions

如果我做以下事情:

 Using scope = New TransactionScope()
        entries.Content.ReadAs(Of IList(Of WebMaint)).AsParallel.ForAll(Sub(entry)
                                                                            _repos.Update(entry)
                                                                        End Sub)
        scope.Complete()
    End Using
Run Code Online (Sandbox Code Playgroud)

TransactionScope不起作用.如果我在scope.complete上放置了一个断点,则没有事务处于活动状态,并且更新已经完成.

如果我改为:

Using scope = New TransactionScope()
            entries.Content.ReadAs(Of IList(Of WebMaint)).ToList().ForEach(Sub(entry)
                                                                               _repos.Update(entry)
                                                                           End Sub)
            scope.Complete()
End Using
Run Code Online (Sandbox Code Playgroud)

一切都按预期工作.任何人都知道为什么并行版本无法正常工作?

Tom*_*icz 4

我不知道它是什么技术,但通常事务是线程绑定的并且不会传播到子线程。话虽如此,您必须在每个线程中启动一个新事务。但这意味着您将拥有与线程一样多的独立事务。

此限制是合理的,因为事务附加到单线程的底层 SQL 数据库连接。