SqlBulkCopy加了事务真的会变快吗?

简介:

使用UseInternalTransaction

在构造函数SqlBulkCopy(String, SqlBulkCopyOptions)里面有SqlBulkCopyOptions的选项,有如下可选项。

我们看到可选项分别有保持Identity键,检查约束,是否锁表,保持null值,触发触发器,使用事务。

所以如果只是想把SqlBulkCopy包含在事务中,只要打开此属性即可。

使用System.Data.SqlClient.SqlTransaction

使用自定义的事务,将SqlBulkCopy和其他操作一起包含在一个事务中。

这种方法只要使用另一个构造函数即可:SqlBulkCopy(SqlConnection, SqlBulkCopyOptions, SqlTransaction)。

需要注意的是:当打开了UseInternalTransaction选项后,就不可以和自定义事务一起使用了,否则会抛出InvalidArgumentException。

事务影响性能?

下面是使用第一种开启事务的测试代码,没有使用事务的代码参见前一篇文章

使用UseInternalTransaction的代码。

复制代码
复制代码
1  using System;  2  using System.Data;  3  using System.Data.SqlClient;  4  5  namespace BulkInsert  6 {  7      static  class Program 8     {  9          static  void Main()  10         {  11             DateTime dateTimeStart = DateTime.Now;  12             Console.WriteLine( " Start Insert: " + dateTimeStart.ToString( " HH:mm:ss fff "));  13              // 导入导出的数据库连接  14              // SqlConnection connectionDestination = new SqlConnection(); 15             SqlConnection connectionSource =  newSqlConnection( " Server =.; User ID=sa; Password=password; Initial CataLog=ExportDataDemo_Source; ");  16  17              // 实例化一个SqlBulkCopy 18              var bulker =  new SqlBulkCopy( " Server =.; User ID=sa; Password=password; Initial CataLog=ExportDataDemo_Destination; ", SqlBulkCopyOptions.UseInternalTransaction) { DestinationTableName =  " DEMOTABLE ", BulkCopyTimeout =  600 };  19  20              // 获取源数据库的数据 21             SqlCommand sqlcmd =  new SqlCommand( " SELECT * FROM DEMOTABLE ", connectionSource);  22             SqlDataAdapter sqlDataAdapter =  new SqlDataAdapter(sqlcmd);  23             DataTable dataTableSource =  new DataTable();  24             sqlDataAdapter.Fill(dataTableSource);  25  26              // 可以重新定义字段的Mapping关系  27               // SqlBulkCopyColumnMapping sqlBulkCopyColumnMapping = new SqlBulkCopyColumnMapping("COL1", "NEW_COL1");  28               // bulker.ColumnMappings.Add(sqlBulkCopyColumnMapping);  29              // connectionDestination.Open(); 30             bulker.WriteToServer(dataTableSource);  31             bulker.Close(); 32             DateTime dateTimeEnd = DateTime.Now;  33             Console.WriteLine( " Insert Ending: " + dateTimeEnd.ToString( " HH:mm:ss fff "));  34         }  35     }  36}
复制代码
复制代码

Source表同样还是10万的数据,每迁移一次后使用TRUNCATE TABLE清空数据,测试三次取平均值。

截图如下。

A:不使用事务

B:使用事务

最终对比数据。单位为秒,忘记加在图表上面了 :)

特定的测试环境与数据,测试结果仅供参考,欢迎交流、讨论。

分类:  SQL
本文转自左正博客园博客,原文链接:http://www.cnblogs.com/soundcode/archive/2012/09/18/2690093.html ,如需转载请自行联系原作者
相关文章
|
SQL 关系型数据库 MySQL
数据库中ISNULL,IFNULL,NULLIF 函数的区别是什么?
数据库中ISNULL,IFNULL,NULLIF 函数的区别
223 0
|
SQL Java
使用Statement操作数据表的弊端
使用Statement操作数据表的弊端
57 0
|
SQL 数据库
【批量添加】-SqlBulkCopy语句
【批量添加】-SqlBulkCopy语句
58 0
|
SQL 关系型数据库 MySQL
MySQL数据库:第十四章:(DML)Data Manipulation Language数据操纵语言
MySQL数据库:第十四章:(DML)Data Manipulation Language数据操纵语言
|
SQL Oracle Java
Statement 实现数据更新|学习笔记
快速学习 Statement 实现数据更新
118 0