Страница 1 из 1

Событие не ловится, если транзакция в действии

Добавлено: 26 окт 2006, 14:10
Aleksandr.
Используются компоненты FibPlus, FireBird 2.
Одна программа делает в таблице запись, регистрирует событие и переходит в режим ожидания эвента в TSibFIBEventAlerter.
Вторая программа просматривает эту таблицу через TPFIBDataSet, для каждой записи вызывает delete+commitretaining и через хп, использующую ту же самую updatetransaction, соответствующее событие:

Код: Выделить всё

procedure TDM.StartEvent(aID: integer);
var
  b : bool;
begin
  if NOT IntDB.Connected then
    Exit;
  b:=IntWT.InTransaction;
  if NOT b then
    IntWT.StartTransaction;
  sp_Event.Prepare;
  sp_Event.Params[0].AsInteger:=aID;
  try
    sp_Event.ExecProc; //POST_EVENT 'eaAccepted'
    if NOT b then
      IntWT.Commit
    else
      IntWT.CommitRetaining
  except
    if b then
      IntWT.RollbackRetaining
    else
      IntWT.Rollback
  end
end;
Параметры транзакции
write
nowait
rec_version
read_committed

Так вот нифига первая программа в таком раскладе не ловит. В ситуациях, когда транзакции вызывается commit - все нормально. А для commitretaining - фигня. Оно так и должно быть и я чего-то недопонимаю?

Добавлено: 26 окт 2006, 15:04
kdv
читай доку. евенты рассылаются только по commit.

Добавлено: 26 окт 2006, 15:46
Dimitry Sibiryakov
А еще почитай о изоляции транзакции. И подумай - увидит ли вторая программа запись которую первая вставила, но не закоммитила.

Добавлено: 26 окт 2006, 16:19
Aleksandr.
Спасибо.