Автоматический откат при выполнении SQL-запросов из C # - PullRequest
0 голосов
/ 13 сентября 2009

У меня проблема с некоторыми запросами SQL, которые заключены в транзакцию. Вот как выглядит код:

using (SqlTransaction dbTrans = conn.BeginTransaction())

{

using (SqlCommand cmd = conn.CreateCommand())

{

  for(Parameters p in parameterList)
  try

  {
      //execute insert commmand
  }
  catch
  {
      //log exception
      //SQL server rolls back everything
      //even though no rollback statement is present!!!
  }

}

dbTrans.Commit();

}

Я пытаюсь выполнить некоторые операторы вставки внутри транзакции, но в случае неудачи все автоматически откатывается. Я знаю, что в большинстве ситуаций такое поведение требуется в моем сценарии, и не имеет значения, если несколько заявлений этого не делают. Причиной существования транзакции является повышение скорости. Я знаю о массовой вставке, но, к сожалению, я не могу использовать ее здесь, так что это то, с чем я должен работать. Не могли бы вы сказать мне, если это возможно, чтобы отключить это поведение, которое я описал?

Ответы [ 6 ]

1 голос
/ 13 сентября 2009

SQL не откатывает все на самом деле. Все зависит от ошибки. Некоторые ошибки отменяют текущую транзакцию, некоторые нет. Например, ошибка нарушения ключа не прерывает транзакцию, и вы можете безопасно продолжить выполнение. См. Серьезность ошибок ядра СУБД для получения подробной информации о серьезности ошибок ядра.

Одна вещь, на которую стоит обратить внимание, - это если ваше приложение меняет настройку по умолчанию SET XACT_ABORT Если для этого параметра установлено значение ON , любая ошибка приведет к прерыванию транзакции. По умолчанию установлено значение OFF.

1 голос
/ 13 сентября 2009

Я думаю, что "все или ничего" является поведением транзакции по умолчанию, и вы не можете изменить его, и неправильно выбирать транзакцию только для скорости.

Вы должны оптимизировать свой код, используя оптимизированные классы и минимизировать количество обращений к базе данных.

Второе, почему вы не можете использовать класс SqlBulkCopy ?? Можете ли вы дать более подробную информацию

1 голос
/ 13 сентября 2009

По сути, вы хотите использовать транзакции, чтобы они не были всеми или ничем. Это просто невозможно. В моем блоге есть сообщение о различных способах ускорения вставки . Это может быть полезно для вас.

0 голосов
/ 13 сентября 2009

Хорошо, ребята, спасибо за все полезные замечания по этому вопросу. Думаю, мне придется оставить все как есть и просто подождать, пока Microsoft добавит эту функцию в будущем, если они вообще это сделают.

0 голосов
/ 13 сентября 2009

Это природа транзакции базы данных, которая должна обеспечивать атомарность. Если операция INSERT завершается неудачно, транзакция должна выполнить откат.

0 голосов
/ 13 сентября 2009

Вы можете написать команду вставки таким образом, чтобы она никогда не выходила из строя. Например:

insert into table1 (id, name) values (1,'charles')
where not exists (select * from table1 where id=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...