导入Excel的时候使用TransactionScope事务控制来进行数据

   最近,项目需要将Excel里面的数据导入到数据库里面,但是由于Excel里面的数据的合法性和数据格式的不确定性。所以不可能每读出一条数据,就保存到数据库中。

  这就使用到了TransactionScope类,首先简要介绍下这个TransactionScope。

  在.net 1.1的时代,还没有TransactionScope类,因此很多关于事务的处理,都交给了SqlTransaction和SqlConnection,每个Transaction是基于每个Connection的。这种设计对于跨越多个程序集或者多个方法的事务行为来说,不是非常好,需要把事务和数据库连接作为参数传入。

在.net 2.0后,TransactionScope类的出现,大大的简化了事务的设计。示例代码如下:

using (TransactionScope trans = new TransactionScope())
            {
                try
                {
                   //CRUD
                }
                catch (Exception)
                {
            //异常处理
                    throw;
                }
                finally
                {
            //释放资源 trans.Dispose(); }

 由上面的代码可以看出,只需要把需要事务包裹的逻辑块写在using (TransactionScope trans= new TransactionScope())中就可以了。从这种写法可以看出,TransactionScope实现了IDispose接口。除非显示调用ts.Complete()方法。否则,系统不会自动提交这个事务。如果在代码运行退出这个block后,还未调用Complete(),那么事务自动回滚了。在这个事务块中,CRUD方法内部都没有用到任何事务类。

  另外需要注意到,TransactionScope类是可以嵌套使用的,如果要嵌套使用,需要在嵌套事务块中指定TransactionScopeOption参数。默认的这个参数为Required。

还有转自大叔的一段话:

  当你的WEB服务器与数据库服务器在同台电脑上,对同一个库进行操作时,它不会提升为分布式事务。

  当你的WEB服务器与数据库服务器在同台电脑上,对于同一个库,建立多个数据上下文时,它不会提升为分布式事务。

  当你的WEB服务器与数据库服务器在同台电脑上,当你操作两个库的表,这时才会提升为分布式事。

  当你的WEB服务器与数据库服务器不在同台电脑上,如果建立多于一个Connection连接,将会发起MSDTC。

  很多段落摘抄自网络,在此对原作者的分享精神,说声谢谢!

posted on 2016-07-06 18:01  CEMaster  阅读(496)  评论(0编辑  收藏  举报

导航