关于ZAKER 融媒体解决方案 合作 加入

c# – 将事务范围添加到 Parallel.Foreach

CocoaChina 11-15

我有一个循环将记录插入数据库 ( 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 的内容写入数据库 .

有任何想法吗?

谢谢 ,

最佳答案

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

但更重要的是 , 要使其工作 , 每个工作线程都需要打开连接 , 在分布式事务中登记它 , 执行插入操作并关闭连接 .

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

更好的是 , 您可能希望查看批量插入 .

以上内容由"CocoaChina"上传发布 查看原文
相关标签 数据库范围事务

觉得文章不错,微信扫描分享好友

扫码分享

热门推荐

查看更多内容