powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / UniDAC + транзакции Firebird
17 сообщений из 17, страница 1 из 1
UniDAC + транзакции Firebird
    #39955704
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не могу понять, в чем проблема.
Firebird поддерживает множественные транзакции.
Хочу в программе реализовать механизм: одна читающая транзакция, другая - пишущая.
Бывают случаи, когда когда нужно вручную управлять пишущими транзакциями, например, когда нужно сделать 100-200-1000 Update, потому что так быстрее - обновить 100 записей, а потом выполнить один раз commit.
Ну или если произошла ошибка на 95ой записи, то нужно отменить все изменения, сделав rollback.

Так вот.
Есть UniConnection с оной читающей TUniTransaction (read;nowait;rec_version;read_committed).
Есть UniSQL с одной пишущей TUniTransaction (write;nowait;rec_version;read_committed).
UniSQL выполняет в цикле обновление записей.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
q := TUniSQL.Create(...);
...
...
    q.SQL.Text := 'update streets set id_region = :id_region where id = :id_street';
    q.Transaction := UniMainModule.transSqlExec;//write;nowait;rec_version;read_committed
    q.Transaction.StartTransaction;

    try

      for I := 0 to pred(dbgStreets.SelectedRows.Count) do
      begin
         ...
         ...
        q.ParamByName('id_region').AsInteger := id_region;
        q.ParamByName('id_street').AsInteger := id_street;

        try
          q.Execute;
        except
          if q.Transaction.Active then q.Transaction.Rollback;
        end;//try-except

      end;// for

      if q.Transaction.Active then q.Transaction.Rollback;// специально отменяю



проблема в том, что я вызываю Rollback, но в базу изменения всё равно попадают, т.к. при q.Execute выполняется Commit без моего разрешения.

У UniConnection есть свойство AutoCommit. Если его включить то проявляется вышеуказанная проблема.

Далее делаем 2 изменения. Теперь отключаем AutoCommit у UniConnection и заменяем строку отказа изменений на
Код: pascal
1.
if q.Transaction.Active then q.Transaction.Commit;


Но теперь изменения в базу не попадают, хотя я и вызываю Commit.

Получается, при (UniConnection1.AutoCommit := true) нельзя управлять транзакциями вручную, транзакции тупо подтверждаются после каждого Execute. А при (UniConnection1.AutoCommit := false) обновления в базу тупо не попадают, даже при явном вызове commit.

Зачем у TUniTransaction есть методы Commit и Rollback, если UniDAC на них тупо кладет болт, извините за выражение.
Ну или что я делаю не так?
Или на каждый TUniSQL, который хочет что-то записать в базу нужен свой отдельный TUniConnection?

В FibPlus было всё просто, понятно и прозрачно. В UniDAC чего-то странного намудрили.
...
Рейтинг: 0 / 0
UniDAC + транзакции Firebird
    #39955711
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,
Убрал бы ты для начала роллбэки из цикла.
И вообще, приведи окончательный код по второму варианту, который якобы не работает.
...
Рейтинг: 0 / 0
UniDAC + транзакции Firebird
    #39955713
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X11
при (UniConnection1.AutoCommit := false) обновления в базу тупо не попадают, даже при явном вызове commit.

Весьма сомнительно сие.
...
Трассировку вызова Commit выполнить - не?
Vlad F
... приведи окончательный код по второму варианту, который якобы не работает.

Поддерживаю. А также трассировку Commit - а.
...
Рейтинг: 0 / 0
UniDAC + транзакции Firebird
    #39955715
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
** такс, разбираюсь, где напартачил...
...
Рейтинг: 0 / 0
UniDAC + транзакции Firebird
    #39955718
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
добавил ещё
Код: pascal
1.
q.SpecificOptions.Values['AutoCommit'] := 'False';



переписал блок
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
        try
          q.Execute;
        except
          on e:exception do
          begin
            if q.Transaction.Active then q.Transaction.Rollback;            
            MessageBox(.....);
          end;// on e



Вроде бы проблема ушла.
Т.е. если после цикла выполняю Rollback, то изменения в базу не попадают, значит, commit после каждой итерации (q.Execute) не выполняется.

P.S.
Сейчас у UniConnection свойство AutoCommit отключено. ЕМНИП, то это свойство имеет приоритет над AutoCommit`ами датасетов. Т.е. если AutoCommit у UniConnection включено, то UniDAC не будет обращать внимания на то, в каком состоянии свойство AutoCommit у датасетов. Таким образом, для ручного управления транзакциями в приложении свойство AutoCommit у UniConnection всегда должно быть отключено.
...
Рейтинг: 0 / 0
UniDAC + транзакции Firebird
    #39955725
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

Чудак-человек, тебе не зря про полный текст статьи написали.
Ибо сейчас из процитированных обрывков по-прежнему получается, что старт транзакции у тебя один раз перед циклом, а подтверждение/отмена на каждой итерации.
...
Рейтинг: 0 / 0
UniDAC + транзакции Firebird
    #39955744
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad F
а подтверждение/отмена на каждой итерации.


только в случае exception
...
Рейтинг: 0 / 0
UniDAC + транзакции Firebird
    #39955748
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X11
Vlad F
а подтверждение/отмена на каждой итерации.


только в случае exception

Ну ты стартуешь транзакцию явно - один раз, ПЕРЕД циклом. В случае исключения ты её завершаешь... и дальше в цикле продолжаешь пыжиться, на каждой итерации гарантированно улетая в эксцепшн: транцакция-то неактивна...
...
Рейтинг: 0 / 0
UniDAC + транзакции Firebird
    #39955749
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, моя ошибка была в том, что я не знал, было ли исключение. Может быть оно действительно и было. А может и не было его.
...
Рейтинг: 0 / 0
UniDAC + транзакции Firebird
    #39955751
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X11,

ты отладчик не используешь, что ли?
...
Рейтинг: 0 / 0
UniDAC + транзакции Firebird
    #39955752
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использую.
Но...
У меня было и так, что изменения в базу записывались, т.е. блок exception не выполнялся.
И при отладке блок exception не выполнялся.
...
Рейтинг: 0 / 0
UniDAC + транзакции Firebird
    #39955767
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

Тебе надо прежде всего решить, что делать, если одна из итераций привела к исключению. Отменять ли только её локальные изменения или весь пакет цикла. Во втором случае роллбэк надо выносить из цикла. В первом, вводить старт транзакции/коммит на каждом витке.
...
Рейтинг: 0 / 0
UniDAC + транзакции Firebird
    #39955820
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я уже решил. Т.к. у меня веб-приложение UniGUI, то приходится полностью выходить из процедуры и отменять все, выдав пользователю текст ошибки.
Модальное окно, чтобы спросить и подождать ответа, показать не получится.
...
Рейтинг: 0 / 0
UniDAC + транзакции Firebird
    #39956014
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да будет флуд

Из-за того, что у меня UniConnection1.AutoCommit для ручного управления транзакциями пришлось установить в False, то оказалось, что теперь не работает AutoCommit у TUniQuery и не важно, включено это свойство или отключено.
Я к тому что, после того, как отредактировал данные прямо в сетке (DBGrid), нужно ручками подтверждать транзакцию после TUniQuery.Post.

По сравнению с FibPlus, у UniDAC немного непривычно, неудобно, можно даже сказать, что и неправильно, нелогично.
Если у набора данных TUniQuery (TUniSQL) включен режим AutoCommit, то он должен работать.
По идее, у TUniConnection вообще не должно быть свойства AutoCommit. Ну, или если оно есть, то должно работать только для метода TUniConnection.ExecSql(...).
...
Рейтинг: 0 / 0
UniDAC + транзакции Firebird
    #39956032
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

Не теряй времени - регистрируй в трекере.))
...
Рейтинг: 0 / 0
UniDAC + транзакции Firebird
    #39956046
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X11,

ты просто не страдай хернёй и отключи автокоммит, везде, и на всю жизнь.
Ничего хорошего в ней нет, кроме плохого. И в фиб+ - тоже.
...
Рейтинг: 0 / 0
UniDAC + транзакции Firebird
    #39956134
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Много простых таблиц-справочников типа id, name и их удобно редактировать прямо в таблице. Нет смысла пилить что-то дополнительное.
Я пока что выкрутился так: в событие OnAfterPost добавил строку
Код: pascal
1.
if Dataset.UpdateTransaction.Active then Dataset.UpdateTransaction.Commit;
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / UniDAC + транзакции Firebird
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]