SqlBulkCopy - Неожиданная существующая транзакция
Я использую SqlBulkCopy
для вставки большого количества данных:
try
{
using (var bulkCopy = new SqlBulkCopy(connection))
{
connection.Open();
using (var tran = connection.BeginTransaction(IsolationLevel.ReadCommitted))
{
bulkCopy.DestinationTableName = "table";
bulkCopy.ColumnMappings.Add("...", "...");
using (var dataReader = new ObjectDataReader<MyObject>(data))
{
bulkCopy.WriteToServer(dataReader);
}
tran.Commit();
return true;
}
}
}
catch (Exception ex)
{
return false;
}
Но я всегда получаю исключение:
Unexpected existing transaction.
Почему это исключение происходит?
Ответы
Ответ 1
"Неожиданная существующая транзакция"... Почему это исключение происходит?
Это происходит, потому что использование конструктора SqlBulkCopy
без указания транзакции будет создавать внутреннюю транзакцию.
Избегайте этого, создав свою транзакцию, а затем используйте ее для создания SqlBulkCopy
. SqlBulkCopy
можно создать с помощью транзакции, которую вы хотите использовать, например:
connection.Open();
using (var tran = connection.BeginTransaction(IsolationLevel.ReadCommitted))
{
using (var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, tran))
{
Ответ 2
Вам нужно использовать конструктор, который принимает транзакцию, поэтому SqlBulkCopy будет знать о транзакции
connection.Open();
using (var tran = connection.BeginTransaction(IsolationLevel.ReadCommitted))
{
using (var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, tran))
{
bulkCopy.DestinationTableName = "table";
bulkCopy.ColumnMappings.Add("...", "...");
using (var dataReader = new ObjectDataReader<MyObject>(data))
{
bulkCopy.WriteToServer(dataReader);
}
tran.Commit();
return true;
}
}