Rollback() при исключении
От: Blackmore  
Дата: 29.01.03 07:54
Оценка:
Обязательно ли вызывать OleDBTransaction.Rollback(), если был вызов OleDBTransaction.Begin(), затем изменение данных, в ходе к-рого возникло исключение? Т.е.


      System.Data.OleDb.OleDbTransaction objTr = null;

      try
      {
        cnShared.Open();

        objTr = cnShared.BeginTransaction();
        cmdDelete.Transaction = objTr;
        if (dsO.HasChanges())
        {
          daO.Update(dsO);
          dsO.AcceptChanges();
        }
        objTr.Commit();
      }
      catch (Exception exAny) 
      {
        objTr.Rollback();
        MessageBox.Show(exAny.Source);
      }
      finally
      {
        cnShared.Close();
      }


Или objTr.Rollback() можно пропустить?
Re: Rollback() при исключении
От: Kostyа  
Дата: 29.01.03 11:16
Оценка:
Здравствуйте, Blackmore, Вы писали:

B>Обязательно ли вызывать OleDBTransaction.Rollback(), если был вызов OleDBTransaction.Begin(), затем изменение данных, в ходе к-рого возникло исключение? Т.е.


B>

B>
B>      System.Data.OleDb.OleDbTransaction objTr = null;

B>      try
B>      {
B>        cnShared.Open();

B>        objTr = cnShared.BeginTransaction();
B>        cmdDelete.Transaction = objTr;
B>        if (dsO.HasChanges())
B>        {
B>          daO.Update(dsO);
B>          dsO.AcceptChanges();
B>        }
B>        objTr.Commit();
B>      }
B>      catch (Exception exAny) 
B>      {
B>        objTr.Rollback();
B>        MessageBox.Show(exAny.Source);
B>      }
B>      finally
B>      {
B>        cnShared.Close();
B>      }
B>


B>Или objTr.Rollback() можно пропустить?



Если не вызывать Rollback, то транзакция будет открытой до момента
закрытия соединения, после чего сервер сам ее откатит. Соответственно
и блокировки будут висеть до закрытия соединения.
Re: Rollback() при исключении
От: alexkro  
Дата: 29.01.03 12:10
Оценка:
Здравствуйте, Blackmore, Вы писали:

B>Обязательно ли вызывать OleDBTransaction.Rollback(), если был вызов OleDBTransaction.Begin(), затем изменение данных, в ходе к-рого возникло исключение? Т.е.


B>

B>
B>      System.Data.OleDb.OleDbTransaction objTr = null;

B>      try
B>      {
B>        cnShared.Open();

B>        objTr = cnShared.BeginTransaction();
B>        cmdDelete.Transaction = objTr;
B>        if (dsO.HasChanges())
B>        {
B>          daO.Update(dsO);
B>          dsO.AcceptChanges();
B>        }
B>        objTr.Commit();
B>      }
B>      catch (Exception exAny) 
B>      {
B>        objTr.Rollback();
B>        MessageBox.Show(exAny.Source);
B>      }
B>      finally
B>      {
B>        cnShared.Close();
B>      }
B>


B>Или objTr.Rollback() можно пропустить?


Я посмотрел, как это сделано в System.Data.dll, и похоже, что Rollback() можно опустить. Dispose() сам вызовет Rollback() если требуется.

Поэтому можно делать так:

using ( OleDbTransaction objTr = cnShared.BeginTransaction() )
{
   //  ... do something

   //  commit
   objTr.Commit();
}  //  rollback happens here
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.