Использование блоков using () во время транзакции ADO.NET

1

Мне нужно сделать относительно тривиальную транзакцию, которая, однако, должна влиять на 5-6 таблиц, поэтому я просмотрел несколько руководств о том, как это сделать, поскольку я никогда раньше не использовал транзакции, и я вложил в них обертывание каждого нового запроса при using(...) блокируйте следующим образом:

SqlTransaction transaction = null;
SqlConnection connection = null;
string localConnString =System.Web.Configuration.WebConfigurationManager..;
try
{
  connection = new SqlConnection(localConnString);
  connection.Open();

  string insertSomeValues = "some SQL INSERT query"..
  using (SqlCommand command = new SqlCommand(insertSomeValues, connection))
  {   
    ..
  }
  using(SqlCommand newCommand = new SqlCommand(otherQuery, connection))
  {
    ..
  }
  transaction.Commit();
}
catch
{
  transaction.Rollback();
}
finally
{
  connection.Close();
}

Поэтому я надеюсь, что у вас есть идея. Проблема, которая, как мне кажется, связана с этой реализацией, заключается в том, что, поскольку блок using находится в pricatice блоке try-catch если исключение выбрасывается где-то по пути дальнейшего выполнения кода, и, что более важно, transaction.Commit(); слишком. Это делает транзакцию бесполезной, так как я заканчиваю частично измененной database когда хочу транзакцию (все или ничего).

Из-за моего отсутствия опыта по этой теме я хотел бы знать, как правильно правильно выполнять такие ситуации. В одном из примеров был флаг bool указывающий, как прошла текущая операция и до вызова transaction.Commit(); там какая-то проверка:

if (!hasErrors)
{
  transaction.Commit();
}

но поскольку я включаю серверные таблицы в свою транзакцию, и у меня есть некоторый запрос, который используется для извлечения информации или проверки чего-либо, идея использования флага не очень заманчива. Я думал об удалении блоков using() чтобы (по крайней мере, я думаю, что это должно произойти) всякий раз, когда возникает ошибка, я перехожу непосредственно к основному блоку catch. Итак, есть идеи, но каков реальный способ справиться с этим?

Теги:
ado.net
transactions

1 ответ

0
Лучший ответ

Я изменил код ur, включив общую транзакцию для всех команд.

SqlTransaction transaction = null;
SqlConnection connection = null;

string localConnString =System.Web.Configuration.WebConfigurationManager..;
try
{
 connection = new SqlConnection(localConnString);
 connection.Open();
 transaction=connection.BeginTransaction();
 string insertSomeValues = "some SQL INSERT query"..
 using (SqlCommand command = new SqlCommand(insertSomeValues, connection,transaction))
 {   
  ..
 }
 using(SqlCommand newCommand = new SqlCommand(otherQuery, connection,transaction))
 {
  ..
 }
 transaction.Commit();
  }
  catch
 {
  transaction.Rollback();
  }
  finally
  {
    connection.Close();
  } 

Ещё вопросы

Сообщество Overcoder
Наверх
Меню