Помогите обуздать транзакцию!

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
Aprell
Сообщения: 3
Зарегистрирован: 11 июл 2007, 10:46

Помогите обуздать транзакцию!

Сообщение Aprell » 11 июл 2007, 10:51

Пишу работу с базой на дельфи, сервер FireBird 1.5.2
вот что происходит:
делаю инсерт
поместил в поле name временное значение "!"
сделал пост, без коммита - записи в базе нет
сбросил значение поля name в null
установил значение поля name "и"
делаю пост с коммитом - в базе запись появилась
значение поля - "!"
что за фигня?

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Re: Помогите обуздать транзакцию!

Сообщение WildSery » 11 июл 2007, 11:05

Aprell писал(а):делаю инсерт...
Руками?
Это ты описываешь "что должно быть сделано". А что, как и чем на самом деле делаешь?

Aprell
Сообщения: 3
Зарегистрирован: 11 июл 2007, 10:46

Сообщение Aprell » 11 июл 2007, 11:14

через pFIBDataSet

нужен код? Просто думал достаточно подробно написал что просиходит...

вот куски кода:
при нажатии добавить

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

Navigator.DataSource.DataSet.Insert;
if SimpleCreate then
  begin
      -- заполняем поля временными значениями, id генерим сами
      Navigator.DataSource.DataSet.Post;
      Navigator.DataSource.DataSet.Locate('id', id, []);
      Navigator.DataSource.DataSet.Edit;
end;

procedure dsActualStateChange(Sender: TObject);
begin
    if dsActual.DataSet.State = dsInsert then
      if SimpleCreate then dsActual.DataSet.Tag := -1 else dsActual.DataSet.Tag := 0;
  end;
end;

у контейнера обработка:
procedure TDM.fibContainerDataSetEvent(DataSet: TDataSet;
  Event: TKindDataSetEvent);
begin
  case Event of
    deAfterPost   : begin
                      if DataSet.Tag = 0 then
                        (DataSet as TpFIBDataSet).Transaction.CommitRetaining;
                    end;
    deAfterDelete : (DataSet as TpFIBDataSet).Transaction.CommitRetaining;
    deAfterCancel : begin
                      (DataSet as TFibDataSet).Transaction.RollbackRetaining;
                    end;
  end;
end;

жмём на кнопку Сохранить:
procedure BtnOKClick(Sender: TObject);
begin
    if (Owner as TfrMain).Navigator.DataSource.DataSet.State in [dsEdit, dsInsert] then
    begin
      if (Owner as TfrMain).SimpleCreate then (Owner as TfrMain).Navigator.DataSource.DataSet.Tag := 0;
      (Owner as TfrMain).Navigator.DataSource.DataSet.Post;
    end;
  Close;
end;

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Re: Помогите обуздать транзакцию!

Сообщение Merlin » 11 июл 2007, 11:50

Aprell писал(а):Пишу работу с базой на дельфи, сервер FireBird 1.5.2
вот что происходит:
делаю инсерт
поместил в поле name временное значение "!"
сделал пост, без коммита - записи в базе нет
сбросил значение поля name в null
установил значение поля name "и"
делаю пост с коммитом - в базе запись появилась
значение поля - "!"
что за фигня?
Это не фигня, а вредность разработчиков. Они, сцуки, спициятельно так сделали, что пока коммита нету, из других транзакциев записи не видать. Они над нами издеваются.

Aprell
Сообщения: 3
Зарегистрирован: 11 июл 2007, 10:46

Сообщение Aprell » 11 июл 2007, 12:00

из каких других транзакций??
вопрос собственно был не об этом или форум приколов перепутали?

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 11 июл 2007, 12:26

Aprell писал(а):из каких других транзакций??
вопрос собственно был не об этом или форум приколов перепутали?
Да вопрос вообще один сплошной прикол. Вместе с кодом.

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Re: Помогите обуздать транзакцию!

Сообщение Ivan_Pisarevsky » 11 июл 2007, 14:29

Aprell писал(а):Пишу работу с базой на дельфи, сервер FireBird 1.5.2
...
что за фигня?
Э, батенька да Вы не то что в трех, Вы в двух соснах (транзакциях) заблудились. :)

Ответить