5

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

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 的内容写入数据库。

有任何想法吗?

谢谢,

4

1 回答 1

7

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

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

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

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

于 2013-09-27T14:58:08.670 回答