【问题标题】:Adding Transaction Scope to Parallel.Foreach将事务范围添加到 Parallel.Foreach
【发布时间】:2013-10-03 22:09:46
【问题描述】:

我有一个循环将记录插入数据库(Firebird):

using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, options))
{
    taskList.Add(Task.Factory.StartNew(() =>
    {       
        Parallel.ForEach(objectList, c =>
        {
            DoInsert(c, id);
        });
    }));

    scope.Complete()
}

如果插入失败,我希望能够批量回滚这些插入。但是,当我在 Parallel.Foreach 循环中执行插入时,事务范围是不可见的。我假设这是因为循环在不同的线程中运行。如果我使用 TransactionScope 作为串行插入来执行此操作,则一切正常。

我尝试使用 DependentTransaction,但似乎无法获取 DoInsert 函数的上下文。 DoInsert 只是打开一个连接并将 C 的内容写入数据库。

有什么想法吗?

谢谢,

【问题讨论】:

标签: c# multithreading concurrency parallel-processing


【解决方案1】:

由于您提到的原因,您无法使用单个 TransactionScope 执行此操作:TransactionScope 依赖于线程本地存储,并且您处于多线程环境中。

但更重要的是,要使其工作,每个工作线程都需要打开一个连接,将其加入分布式事务,执行插入操作,然后关闭连接。

如果这些是简单的插入,我会很惊讶创建所有这些连接会给您带来任何性能优势。事实上,我相信如果您在单个线程和单个连接上执行此程序会快得多。显然,这意味着连接打开(和关闭)一次,并作为参数传递给DoInsert 方法。

更好的是,您可能想查看批量插入。

【讨论】:

    猜你喜欢
    • 2015-07-27
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    • 1970-01-01
    • 2016-08-02
    • 1970-01-01
    相关资源
    最近更新 更多