TransactionScope 无法与并行扩展一起使用?

发布于 2024-12-17 01:11:00 字数 884 浏览 0 评论 0原文

如果我执行以下操作:

 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

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

If i do the following:

 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 doesn't work. If i put a breakpoint on the scope.complete no transaction is active and the updates are already complete.

If i change it to:

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

Everything works as expected. Anyone know why the parallel version doesn't work correctly?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

水中月 2024-12-24 01:11:00

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

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

I have no idea what technology is it, but typically transactions are thread bound and do not propagate to children threads. That being said you will have to start a new transaction in each thread. But this means you will have as many independent transactions as threads.

This limitation is reasonable since the transaction is attached to the underlying SQL database connection which is single threaded.

一念一轮回 2024-12-24 01:11:00

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

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 语法问题,这不是我的母语

You can propagate the transaction to the worker threads as follows:

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

NOTE: please forgive any VB syntax issues, 'tis not my native tongue

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文