如果我执行以下操作:
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
一切都按预期工作。任何人都知道为什么并行版本无法正常工作?
答案 0 :(得分:4)
我不知道它是什么技术,但通常事务是线程绑定的,不会传播到子线程。话虽这么说,你必须在每个线程中开始一个新的事务。但这意味着您将拥有与线程一样多的独立事务。
此限制是合理的,因为事务附加到单线程的基础SQL数据库连接。
答案 1 :(得分: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语法问题,'这不是我的母语