导入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。
很多段落摘抄自网络,在此对原作者的分享精神,说声谢谢!