• 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             //实例化一个SqlBulkCopy18             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:使用事务

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

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

  • 相关阅读:
    【Java开发记录】Dnslog访问记录模块实现(六)
    Java 内部类使用
    SQL 万能分页存储过程
    oom排查方法
    vite项目中报错require使用问题
    使用taro和原生开发小程序零散总结
    ECMscript与javaScript在不同平台下的关系
    微信createOffscreenCanvas将两张图合成一张图
    小程序使用taro将两张图合在一起,并保存到相册
    报Error: cannot find module 'XX/package.json'
  • 原文地址:https://www.cnblogs.com/soundcode/p/2690093.html
Copyright © 2020-2023  润新知