zoukankan      html  css  js  c++  java
  • 导入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。

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

  • 相关阅读:
    Ubuntu查看端口占用情况
    在jupyter中添加新的环境
    C++指针
    C++排序:冒泡排序,简单选择排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序
    查找一:C++静态查找
    C++链式队列
    C++顺序循环队列
    C++链式栈
    C++顺序栈
    C++双向循环链表
  • 原文地址:https://www.cnblogs.com/cemaster/p/5647678.html
Copyright © 2011-2022 走看看