SqlTransaction tran = null;
try
{
  // Открыть соединение и создать транзакцию.
  con.Open();
  tran = con.BeginTransaction();
  // Включить две команды в транзакцию.
  cmd1.Transaction = tran;
  cmd2.Transaction = tran;
  // Выполнить обе команды.
  cmd1.ExecuteNonQuery();
  cmd2.ExecuteNonQuery();
  // Подтвердить транзакцию.
  tran.Commit();
}
catch
{
  // В случае ошибки отменить транзакцию.
  tran.Rollback();
}
finally
{
  con.Close();
)

Обратите внимание, что не достаточно просто создать и подтвердить транзакцию. Также необходимо явно перечислить каждый объект Command как часть транзакции, установив значение их свойства Command.Transaction равным объекту Transaction. Если вы попытаетесь выполнить команду, которая не является частью текущей транзакции, пока транзакция находится в процессе выполнения, то получите ошибку. Однако в будущем эта объектная модель сможет позволить поддержку более одной транзакции одновременно в пределах одного соединения.

Совет. Вместо использования отдельных объектов команд вы можете также выполнить один и тот же объект дважды, просто по ходу модифицируя его свойство CommandText (если это динамический оператор SQL) или значения его параметров (если это параметризованная команда). Например, если ваша команда вставляет новую запись, вы можете применить такой подход для вставки двух записей в одной транзакции.

Чтобы протестировать свойство отката (отмены) транзакции, вы можете вставить следующую строку непосредственно перед вызовом метода Commit() в предыдущем примере:

throw new ApplicationException();

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

Хотя транзакции ADO.NET вращаются вокруг объектов Connection и Transaction, лежащие в основе команды не отличаются от тех, что применяются в транзакциях хранимых процедур. Например, когда вызывается метод BeginTransaction() с провайдером данных SQL Server, он посылает базе данных команду BEGIN TRANSACTION.

предыдущая    следующая страница   оглавление

328

Hosted by uCoz