【发布时间】:2014-12-22 09:18:31
【问题描述】:
我正在通过SqlBulkCopy 插入数据,如下所示:
public void testBulkInsert(string connection, string table, DataTable dt)
{
using (SqlConnection con = new SqlConnection(connection))
{
con.Open();
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(con))
{
bulkCopy.DestinationTableName = table;
bulkCopy.WriteToServer(dt);
}
}
}
这是否会自动包装在 SQL 事务中,以便如果在执行过程中出现问题,DB 将保持与开始批量插入之前相同的状态?还是会插入一半的数据?
即我有必要显式调用con.BeginTransaction
或者,如果我调用SqlBulkCopy 的构造函数,它接受一个字符串,这是让它在事务中发生的更好方法吗?
public void testBulkInsert(string connection, string table, DataTable dt)
{
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
{
bulkCopy.DestinationTableName = table;
bulkCopy.WriteToServer(dt);
}
}
我发现docs 在这件事上有点不清楚,因为他们最初是这么说的
默认情况下,大容量复制操作是作为独立的 手术。大容量复制操作以非事务方式发生, 没有机会回滚
但后来状态
默认情况下,大容量复制操作是它自己的事务。当你 想要执行专用的批量复制操作,创建一个新实例 SqlBulkCopy 与连接字符串,或使用现有的 没有活动事务的 SqlConnection 对象。在每种情况下, 大容量复制操作创建,然后提交或回滚 交易。
那么有必要这样做吗:
public void testBulkInsert(string connection, string table, DataTable dt)
{
using (SqlConnection con = new SqlConnection(connection))
{
con.Open();
using (SqlTransaction tr = con.BeginTransaction(IsolationLevel.Serializable))
{
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(con, SqlBulkCopyOptions.Default, tr))
{
bulkCopy.DestinationTableName = table;
bulkCopy.WriteToServer(dt);
}
tr.Commit();
}
}
}
【问题讨论】:
-
为什么不试试呢?文档的哪一部分让您认为它会这样做?
-
这部分:默认情况下,大容量复制操作是它自己的事务,但它也说大容量复制操作以非事务方式发生,与没有机会回滚所以......这有点令人困惑
标签: c# sql-server transactions bulkinsert sqlbulkcopy