【问题标题】:Will SqlBulkCopy Close method commit/Dispose external transaction?SqlBulkCopy Close 方法会提交/处理外部事务吗?
【发布时间】:2015-09-11 21:06:01
【问题描述】:

我有一个 SQL 大容量复制函数,它具有以下代码来创建大容量复制实例。

 SqlBulkCopy bulkCopy = new SqlBulkCopy((SqlConnection) WorkConnection,
            SqlBulkCopyOptions.FireTriggers, (SqlTransaction) WorkTransaction);

“WorkTransaction”是一个外部事务。它会发生什么

  1. 如果我们在 SqlBulkCopy 周围使用“使用”块。它会处理这个外部交易吗?
  2. 如果我们调用关闭函数(“bulkCopy.Close();”),它会提交/释放外部事务吗?

任何帮助将不胜感激!

谢谢

【问题讨论】:

  • Rollback for bulk copy 的可能重复项
  • 我非常怀疑它会否决这一点,但这听起来很容易自己测试。启动 SQL Profiler 并运行您的代码。如果你看到COMMIT,答案是肯定的,如果你没有看到,那么答案是否定的。
  • 调用Dispose()(将其放在“使用”块中)调用Close() 函数。请参阅Close method 的备注部分。

标签: c# sqltransaction


【解决方案1】:

没有。向SqlBulkCopy 提供外部事务的目的是允许事务中包含其他操作,因此除非发生错误,否则SqlBulkCopy 不会终止事务。

来自MS Doc

您可以将现有的 SqlTransaction 对象指定为 SqlBulkCopy 构造函数。在这种情况下,批量复制操作是 在现有事务中执行,并且不会对 事务状态(即它既没有提交也没有中止)。这 允许应用程序将大容量复制操作包含在 与其他数据库操作的事务。

【讨论】:

  • 从您刚刚粘贴的内容来看,您为什么说“除非发生错误”?听起来即使发生错误也不影响事务状态?
  • 谢谢...我已经读过了。但它并没有谈到关闭 Bulkcopy。
  • 是的,“事务状态没有改变”这意味着它不会影响状态,即使你处理/关闭类。
猜你喜欢
  • 2015-03-15
  • 2014-12-22
  • 2016-03-31
  • 1970-01-01
  • 1970-01-01
  • 2016-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多