Вопрос по транзакциям

Kotъ-Begemotъ
Дата: 28.08.2012 16:19:04
В программе, периодически возникает необходимость поставить на заказ определённую пометку. Делается простым апдейтом (QueryValue из FIB+) с явным стартом транзакции, и явным коммитом (и откатом при ошибке). Параметры транзакции, в которой делается попытка выполнить этот апдейт:

isc_tpb_write
isc_tpb_nowait
isc_tpb_concurrency

И почему-то с какого-то момента, стали возникать ошибки - пометка не выставляется. Я правильно понимаю, что при таких параметрах TPB причина может быть только одна - наличие незакомиченной транзакции, стартовавшей раньше моей? Вроде всё просмотрел, нигде не могу найти, чтобы в этот момент, с заказом кто-то другой что-либо делал! На локале не воспроизводится вообще, только при многопользовательской работе всплывает. Или тут ещё какие-то причины могут быть?
kdv
Дата: 28.08.2012 16:26:28
Kotъ-Begemotъ,

ошибки? какие ошибки...
Kotъ-Begemotъ
Дата: 28.08.2012 16:46:21
kdv
Kotъ-Begemotъ,
ошибки? какие ошибки...


Не знаю, там банальный блок try except я только вкорячил туда запись в лог текста ошибки, завтра поставлю юзерам, и почитаю лог. А была просто функция, которая апдейтила поле, и возвращала True или False. Всё работало не один год, а тут жалобы пошли, то есть функция возвращает False потому что в ней выполняется ветка except. Вот я и пытаюсь с помощью ХШ понять что там могло произойти. Данные по ошибке смогу получить только завтра...
kdv
Дата: 28.08.2012 16:47:46
Kotъ-Begemotъ
там банальный блок try except

прелестно. вот так?
try
  // тут чё-та делаем
except
end
Kotъ-Begemotъ
Дата: 28.08.2012 16:52:50
kdv, нет, не совсем :-)

Было:
  DM.transWriteAdd.StartTransaction;
  try
    DM.dbTaxi.QueryValue(Format('UPDATE ORDERS SET UNCOMF=%d WHERE ORDERID = %d',  [Mark, OrderID]), 0, DM.transWriteAdd);
    DM.transWriteAdd.Commit;
    Result := True;
   except
     DM.transWriteAdd.Rollback;
     Result := False;
  end;


Стало:

  DM.transWriteAdd.StartTransaction;
  try
    DM.dbTaxi.QueryValue(Format('UPDATE ORDERS SET UNCOMF=%d WHERE ORDERID = %d',  [Mark, OrderID]), 0, DM.transWriteAdd);
    DM.transWriteAdd.Commit;
    Result := True;
   except
    on E: Exception do
     begin
      DM.WriteErrorLog(Format(''Ошибка! Заказ №%d Сообщение: %s', [OrderID, E.Message]));
      DM.transWriteAdd.Rollback;
      Result := False;
     end;
  end;
kdv
Дата: 28.08.2012 16:56:46
Kotъ-Begemotъ
нет, не совсем :-)

почти один хрен. сожрал Exception и сделал rollback. Не сильно осуждаю, но раз сожрал exception, значит ошибки не видать.
Dimitry Sibiryakov
Дата: 28.08.2012 17:00:56

Kotъ-Begemotъ
Стало:

А вот это очень непростой вопрос: сначала писать лог, а потом откатывать транзакцию или
наоборот. При ошибке записи - транзакция не откатится. Наоборот - при ошибке отката ошибка
не запишется.

PS: Лично я сделал так, что Rollback никогда не бросает исключений, но что с адепта
возьмёшь...

Posted via ActualForum NNTP Server 1.5

kdv
Дата: 28.08.2012 17:19:56
Dimitry Sibiryakov
При ошибке записи - транзакция не откатится.

потому что откатывать нечего. особенно когда у него в транзакции один update.

Dimitry Sibiryakov
что Rollback никогда не бросает исключений

imho для rollback наиболее вероятная ошибка - это когда перед ним обрубился коннект.
если, конечно, не использовать триггеры на rollback.
Dimitry Sibiryakov
Дата: 28.08.2012 18:56:13

kdv
imho для rollback наиболее вероятная ошибка - это когда перед ним обрубился
коннект.

Собственно, это единственная известная мне ошибка, но частоту её появления нельзя
недооценивать, именно в случае когда Rollback стоит в except.

Posted via ActualForum NNTP Server 1.5

Гаджимурадов Рустам
Дата: 28.08.2012 19:07:07
Dimitry Sibiryakov
именно в случае когда Rollback стоит в except.
Application.OnException должен быть всегда. Ибо.