6

如果我执行以下操作:

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

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

一切都按预期工作。任何人都知道为什么并行版本不能正常工作?

4

2 回答 2

4

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

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

于 2011-11-18T19:33:41.977 回答
4

您可以将事务传播到工作线程,如下所示:

Using scope = New TransactionScope()
    Dim rootTransaction As Transaction  = Transaction.Current

    entries.Content.ReadAs(Of IList(Of WebMaint)).AsParallel.ForAll(
        Sub(entry)    
            Dim dependentTransaction As DependentTransaction = rootTransaction.DependentClone(DependentCloneOption.RollbackIfNotComplete)

            _repos.Update(entry)

            dependentTransaction.Complete()
        End Sub)        

    scope.Complete()
End Using

注意:请原谅任何 VB 语法问题,这不是我的母语

于 2011-11-24T00:29:44.330 回答