|
PostgreSQL + DAO транзакция - теряются изменения
|
|||
---|---|---|---|
#18+
Добрый день, коллеги. Переезжаем с Аccess на PostgreSQL. Вроде бы всё работает на первый взгляд удовлетворительно, но в одном месте наткнулся на опасную ошибку. При использовании транзакции код отрабатывает без ошибок, но запись в таблице не появляется! Поскольку транзакции используются в коде повсеместно, очень опасная тенденция. Код VBA такой Код: vbnet 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. 26. 27. 28. 29. 30. 31. 32. 33.
В этом месте транзакция не критична, но в большинстве других мест это не так. Не понятно, почему пропадает часть изменений и как отследить, что записи не пропадают? Потому как в некоторых местах без специального исследования и не поймёшь, что что-то пошло не так и часть данных пропала по дороге. В другом месте нормально отрабатывали гораздо более длинные транзакции, но там были только рекордсеты, я так понимаю всё портит CurrentDb.Execute... Возможно, там не такой коннект как у СurrentDb.OpenRecordset, но я не уверен Переписать под ADO единовременно не представляется возможным, ибо данные переносятся по кускам и некоторых таблиц на сервере ещё долго не будет... К тому же никто не гарантирует, что там это не будет работать точно так же. В общем, мистика и жёпа - на дебаг всех форм и всех транзакции уйдут остатки молодости, нужно искать корень и системное решение. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2015, 14:56 |
|
PostgreSQL + DAO транзакция - теряются изменения
|
|||
---|---|---|---|
#18+
Попробуйте выполнить Set db = CurrentDb ( или Set db = wrkW.Databases(0) ) перед wrkW.BeginTrans и в коде использовать db. Сколько записей за раз обновляет запрос? Может лучше открыть Recordset и внести изменения туда? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2015, 16:21 |
|
PostgreSQL + DAO транзакция - теряются изменения
|
|||
---|---|---|---|
#18+
Анатолий ( Киев )Попробуйте выполнить Set db = CurrentDb ( или Set db = wrkW.Databases(0) ) перед wrkW.BeginTrans и в коде использовать db. Сколько записей за раз обновляет запрос? Может лучше открыть Recordset и внести изменения туда? Через db не работает... Конечно, если всё переделать в запросы или всё решить через рекордсеты, всё работает, но это значит, в первую очередь, что оригинальный код не работает, а это было основной целью... Если переписывать все транзакции - это очень много работы и не всегда это можно будет корректно переписать, чтобы всё работало в одной транзакции (некоторые - довольно длинные). Там много где проще с нуля переписать, чем переделать корректно... ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2015, 16:40 |
|
PostgreSQL + DAO транзакция - теряются изменения
|
|||
---|---|---|---|
#18+
ШыфлЧерез db не работает... В смысле, вообще не работает или ничего не изменилось? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2015, 17:02 |
|
PostgreSQL + DAO транзакция - теряются изменения
|
|||
---|---|---|---|
#18+
Анатолий ( Киев )ШыфлЧерез db не работает... В смысле, вообще не работает или ничего не изменилось? В смысле работает, но данные теряются... Заметил ещё одну хрень - если db.Execute происходит раньше, чем tb1.Update, то данные не теряются... Короче, в рамках существующего приложения - жуткий рандомный баг :( ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2015, 17:27 |
|
PostgreSQL + DAO транзакция - теряются изменения
|
|||
---|---|---|---|
#18+
Включил логи на стороне сервера, посмотреть что посылает Ассеss. Выяснилось, что строка Код: vbnet 1.
посылается на сервер 2 раза, один раз в виде Код: plsql 1.
что вызывает ошибку на сервере и откат транзакции, но Access эту ошибку не выдаёт, а посылает следом запрос вида Код: plsql 1. 2.
который проходит, но уже в новой транзакции, которую Jet воспринимает как исходную, и делает вид, что всё нормально. Вопросы, собственно, таковы 1) Почему возникает первый, не валидный запрос? 2) Как сделать его валидным/отключить? 3) Почему не возникает ошибки, а данные теряются "по тихому"? Подозреваю, что где-то должна быть настройка, параметр или галочка, которая всё исправит... ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2015, 13:36 |
|
PostgreSQL + DAO транзакция - теряются изменения
|
|||
---|---|---|---|
#18+
Шыфл, м-да, пока что помогло удаление параметра dbFailOnError, теперь строка Код: vbnet 1.
для сервера выглядит как Код: plsql 1. 2. 3. 4. 5.
Но зато не падает, и транзакция срабатывает корректно. Что б в МS так жили, как их Jet запросы генерирует... Или может я зря на Jet? Может это драйвер чудит? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2015, 00:17 |
|
PostgreSQL + DAO транзакция - теряются изменения
|
|||
---|---|---|---|
#18+
Шыфл, На каком решении остановились? Что вызывало проблему? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2017, 00:12 |
|
PostgreSQL + DAO транзакция - теряются изменения
|
|||
---|---|---|---|
#18+
Nebo, Убрали из всех запросов параметр Код: vbnet 1.
Похоже, что драйвер для PG его не правильно воспринимает. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2017, 11:49 |
|
PostgreSQL + DAO транзакция - теряются изменения
|
|||
---|---|---|---|
#18+
ШыфлNebo, Убрали из всех запросов параметр Код: vbnet 1.
Похоже, что драйвер для PG его не правильно воспринимает. А так всё работает нормально? да? На днях читал, ссылка где-то утонула, что луче всего использовать view. Что Аксесс якобы что-то делает с запросами. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2017, 15:09 |
|
PostgreSQL + DAO транзакция - теряются изменения
|
|||
---|---|---|---|
#18+
Нашёл The PostgreSQL ODBC driver is actively developed and an Access front-end combined with PostgreSQL server, in my opinion makes a great option on a LAN for rapid development. I have been involved in a reasonably big system (100+ PostgreSQL tables, 200+ Access forms, 1000+ Access queries & reports) and it has run excellently for a few years, with ~20 users. Any queries running slow because Access is doing something stupid can generally just be solved by using views, and any really data-intensive code can easily be moved into PostgreSQL functions and then called from Access. https://stackoverflow.com/questions/37991/using-ms-access-odbc-to-connect-to-a-remote-postgresql ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2017, 15:10 |
|
PostgreSQL + DAO транзакция - теряются изменения
|
|||
---|---|---|---|
#18+
NeboШыфлNebo, Убрали из всех запросов параметр Код: vbnet 1.
Похоже, что драйвер для PG его не правильно воспринимает. А так всё работает нормально? да? На днях читал, ссылка где-то утонула, что луче всего использовать view. Что Аксесс якобы что-то делает с запросами. Я уже не в проекте, но знаю, что всё работает почти 2 года уже. Некоторые запросы и отчёты тупят, их по-тихоньку переписывают в процедуры на PgPL/SQL. Идея была перенести таблицы из Акса в PG так, чтобы код Акса этого не заметил. Это вцелом удалось без особых проблем, подготовка таблиц, миграция и первичные тесты заняли где-то месяцa два. Пару особо жутких запросов пришлось сразу переделать, потому что view на view на view работало очень медленно. Некоторые конструкции, типа Recordset.MoveFirst и dbFailOnError пришлось исключись, кое-где пришлось добавить первичные ключи (где не было). Но всё запустилось, дальше они сами - я уехал в Чехию. Пару раз созванивались с ИТ директором - всё работает, благодарствует. По-тихоньку переписывают каскады view в pgPL/SQL a формы под WPF. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2017, 15:32 |
|
|
start [/forum/topic.php?fid=45&msg=39090141&tid=1612170]: |
0ms |
get settings: |
12ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
68ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
others: | 321ms |
total: | 491ms |
0 / 0 |