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;

   }
}