博客文章

Orchard大数据操作之事务分批提交 - RequireNew

作者: cabbage89      时间: 2014年1月17日 11:22:00

首先感谢Orchard中文群的@昆山|cc 兄弟技术支持!

本人正在做一个爬虫,从某站爬取超大的数据,准备边爬边插入到数据库, 可以在测试过程中发现异常时 之前爬了很久的数据根本没有插入到数据库, 于是这种情况下我对Orchard NH的事务产生了质疑~

当我试图做一个独立的事务时

            using (var trans = new TransactionScope(TransactionScopeOption.Suppress))

            {

                 //大数据操作

            }

发现没有什么效果 ~~

于是在看 Orchard.Framework/Data/Repository.cs 的源码,发现在取 NH会话时调用了 SessionLocator.For() 方法,进一步跳入进去看源码 ,看到

((ITransactionManager)this).Demand();

哦,原来Orchard 里面的每个数据库操作都强制要求事务的.

幸好Orchard 优秀的设计,里面提供了一个 RequireNew 方法, 于是可以在每一批操作前加上一句

                for(这里循环大数据的每一批)

               {

                     //在此插入一批数据

                    _transactionManager.RequireNew();

               }

_transactionManager 可以直接通过IOC在构造方法中获取