是否可以将System.Transactions.TransactionScope与SqlBulkCopy一起使用?

.net sqlbulkcopy sql-server transactionscope

非常简单的问题:是否可以将System.Transactions.TransactionScopeSqlBulkCopy一起使用?文档事务和批量复制操作没有提到任何内容(至少从.NET 4.0开始),我的测试表明它不会自动登记到TransactionScope

热门答案

SqlBulkCopy永远不会进入事务。 SqlCommand也不这样做。常见的误解。登记是在调用SqlConnection.Open执行的。之后,在该连接上运行的任何内容都是隐式的事务的一部分。实际上,不再允许传递显式事务。

如果希望SqlBulkCopy使用TransactionScope参与System.Transactions.Transaction则必须在打开连接时设置事务。

这很容易做到:

using (var tran = new TransactionScope(...))
using (var conn = new SqlConnection(connStr))
{
  conn.Open(); //This enlists.

  using (var sqlBulkCopy = new SqlBulkCopy(conn)) {
    sqlBulkCopy.WriteToServer(...);
  }

  tran.Complete(); //Commit.
}

这段代码就是您所需要的。可能的错误:

  1. 交易必须尽早开放。
  2. 不要使用SqlBulkCopySqlTransaction参数。传递null
  3. 不要使用SqlBulkCopyOptions.UseInternalTransaction
  4. 除非您想要实际执行某些操作,否则不要添加异常处理。如果没有提交,则回滚是自动的。
  5. 使用using语句进行清除代码和确定性清理。除非必须,否则请勿手动关闭或处置任何这些对象。这将是多余的。

您可以使用任何您喜欢的批量大小,所有批次都将成为交易的一部分。因此,批处理具有有限的价值(特别是事务日志不能提前截断)。首先尝试不批处理。



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因