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 = new SqlConnection( " 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:使用事务

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值