|
|
|
UniDAC + транзакции Firebird
|
|||
|---|---|---|---|
|
#18+
Не могу понять, в чем проблема. 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. проблема в том, что я вызываю Rollback, но в базу изменения всё равно попадают, т.к. при q.Execute выполняется Commit без моего разрешения. У UniConnection есть свойство AutoCommit. Если его включить то проявляется вышеуказанная проблема. Далее делаем 2 изменения. Теперь отключаем AutoCommit у UniConnection и заменяем строку отказа изменений на Код: pascal 1. Но теперь изменения в базу не попадают, хотя я и вызываю Commit. Получается, при (UniConnection1.AutoCommit := true) нельзя управлять транзакциями вручную, транзакции тупо подтверждаются после каждого Execute. А при (UniConnection1.AutoCommit := false) обновления в базу тупо не попадают, даже при явном вызове commit. Зачем у TUniTransaction есть методы Commit и Rollback, если UniDAC на них тупо кладет болт, извините за выражение. Ну или что я делаю не так? Или на каждый TUniSQL, который хочет что-то записать в базу нужен свой отдельный TUniConnection? В FibPlus было всё просто, понятно и прозрачно. В UniDAC чего-то странного намудрили. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2020, 17:08 |
|
||
|
UniDAC + транзакции Firebird
|
|||
|---|---|---|---|
|
#18+
X11, Убрал бы ты для начала роллбэки из цикла. И вообще, приведи окончательный код по второму варианту, который якобы не работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2020, 17:52 |
|
||
|
UniDAC + транзакции Firebird
|
|||
|---|---|---|---|
|
#18+
X11 при (UniConnection1.AutoCommit := false) обновления в базу тупо не попадают, даже при явном вызове commit. Весьма сомнительно сие. ... Трассировку вызова Commit выполнить - не? Vlad F ... приведи окончательный код по второму варианту, который якобы не работает. Поддерживаю. А также трассировку Commit - а. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2020, 18:09 |
|
||
|
UniDAC + транзакции Firebird
|
|||
|---|---|---|---|
|
#18+
** такс, разбираюсь, где напартачил... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2020, 18:32 |
|
||
|
UniDAC + транзакции Firebird
|
|||
|---|---|---|---|
|
#18+
добавил ещё Код: pascal 1. переписал блок Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. Вроде бы проблема ушла. Т.е. если после цикла выполняю Rollback, то изменения в базу не попадают, значит, commit после каждой итерации (q.Execute) не выполняется. P.S. Сейчас у UniConnection свойство AutoCommit отключено. ЕМНИП, то это свойство имеет приоритет над AutoCommit`ами датасетов. Т.е. если AutoCommit у UniConnection включено, то UniDAC не будет обращать внимания на то, в каком состоянии свойство AutoCommit у датасетов. Таким образом, для ручного управления транзакциями в приложении свойство AutoCommit у UniConnection всегда должно быть отключено. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2020, 19:07 |
|
||
|
UniDAC + транзакции Firebird
|
|||
|---|---|---|---|
|
#18+
X11, Чудак-человек, тебе не зря про полный текст статьи написали. Ибо сейчас из процитированных обрывков по-прежнему получается, что старт транзакции у тебя один раз перед циклом, а подтверждение/отмена на каждой итерации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2020, 19:49 |
|
||
|
UniDAC + транзакции Firebird
|
|||
|---|---|---|---|
|
#18+
Vlad F а подтверждение/отмена на каждой итерации. только в случае exception ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2020, 21:25 |
|
||
|
UniDAC + транзакции Firebird
|
|||
|---|---|---|---|
|
#18+
X11 Vlad F а подтверждение/отмена на каждой итерации. только в случае exception Ну ты стартуешь транзакцию явно - один раз, ПЕРЕД циклом. В случае исключения ты её завершаешь... и дальше в цикле продолжаешь пыжиться, на каждой итерации гарантированно улетая в эксцепшн: транцакция-то неактивна... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2020, 21:33 |
|
||
|
UniDAC + транзакции Firebird
|
|||
|---|---|---|---|
|
#18+
Да, моя ошибка была в том, что я не знал, было ли исключение. Может быть оно действительно и было. А может и не было его. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2020, 21:36 |
|
||
|
UniDAC + транзакции Firebird
|
|||
|---|---|---|---|
|
#18+
X11, ты отладчик не используешь, что ли? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2020, 21:40 |
|
||
|
UniDAC + транзакции Firebird
|
|||
|---|---|---|---|
|
#18+
Использую. Но... У меня было и так, что изменения в базу записывались, т.е. блок exception не выполнялся. И при отладке блок exception не выполнялся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2020, 21:44 |
|
||
|
UniDAC + транзакции Firebird
|
|||
|---|---|---|---|
|
#18+
X11, Тебе надо прежде всего решить, что делать, если одна из итераций привела к исключению. Отменять ли только её локальные изменения или весь пакет цикла. Во втором случае роллбэк надо выносить из цикла. В первом, вводить старт транзакции/коммит на каждом витке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2020, 22:31 |
|
||
|
UniDAC + транзакции Firebird
|
|||
|---|---|---|---|
|
#18+
Я уже решил. Т.к. у меня веб-приложение UniGUI, то приходится полностью выходить из процедуры и отменять все, выдав пользователю текст ошибки. Модальное окно, чтобы спросить и подождать ответа, показать не получится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2020, 09:41 |
|
||
|
UniDAC + транзакции Firebird
|
|||
|---|---|---|---|
|
#18+
Да будет флуд Из-за того, что у меня UniConnection1.AutoCommit для ручного управления транзакциями пришлось установить в False, то оказалось, что теперь не работает AutoCommit у TUniQuery и не важно, включено это свойство или отключено. Я к тому что, после того, как отредактировал данные прямо в сетке (DBGrid), нужно ручками подтверждать транзакцию после TUniQuery.Post. По сравнению с FibPlus, у UniDAC немного непривычно, неудобно, можно даже сказать, что и неправильно, нелогично. Если у набора данных TUniQuery (TUniSQL) включен режим AutoCommit, то он должен работать. По идее, у TUniConnection вообще не должно быть свойства AutoCommit. Ну, или если оно есть, то должно работать только для метода TUniConnection.ExecSql(...). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2020, 20:38 |
|
||
|
UniDAC + транзакции Firebird
|
|||
|---|---|---|---|
|
#18+
X11, Не теряй времени - регистрируй в трекере.)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2020, 22:19 |
|
||
|
UniDAC + транзакции Firebird
|
|||
|---|---|---|---|
|
#18+
X11, ты просто не страдай хернёй и отключи автокоммит, везде, и на всю жизнь. Ничего хорошего в ней нет, кроме плохого. И в фиб+ - тоже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2020, 00:34 |
|
||
|
UniDAC + транзакции Firebird
|
|||
|---|---|---|---|
|
#18+
Много простых таблиц-справочников типа id, name и их удобно редактировать прямо в таблице. Нет смысла пилить что-то дополнительное. Я пока что выкрутился так: в событие OnAfterPost добавил строку Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2020, 10:34 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39955711&tid=2038338]: |
0ms |
get settings: |
7ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
223ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
| others: | 220ms |
| total: | 528ms |

| 0 / 0 |
