Обязательно ли вызывать 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() можно пропустить?
Здравствуйте, 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, то транзакция будет открытой до момента
закрытия соединения, после чего сервер сам ее откатит. Соответственно
и блокировки будут висеть до закрытия соединения.
Здравствуйте, 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