|
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
|
|||
---|---|---|---|
#18+
Из стороннего (third party) приложения работаю с базой Firebird 3. Проблема следующая. Если я выполняю запрос "INSERT ...", делаю commit, то новые данные становятся доступными сразу (например, в IBExpert'е). Если же я выполняю запрос "EXECUTE PROCEDURE ...", которая делает то же самое, то новые данные становятся доступными только после отключения от базы в приложении. P.S. Проверил в IBExpert'е с помощью ODBCViewer Если выполнить "EXECUTE PROCEDURE ...", затем "INSERT" или "UPDATE" куда-нибудь (с коммитами), то данные обновляются. Можно ли, какие и где параметры драйвера подкрутить, чтобы запрос "EXECUTE PROCEDURE ..." сразу нормально коммитился? Или другой способ, если драйвер не виноват. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2020, 19:38 |
|
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2020, 20:36 |
|
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
|
|||
---|---|---|---|
#18+
Jarz, либо это есть в настройках драйвера (autocommit), либо облом без явного завершения транзакций. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2020, 22:05 |
|
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
|
|||
---|---|---|---|
#18+
Jarz Если я выполняю запрос "INSERT ...", делаю commit, то новые данные становятся доступными сразу (например, в IBExpert'е). Если же я выполняю запрос "EXECUTE PROCEDURE ...", которая делает то же самое, то новые данные становятся доступными только после отключения от базы в приложении. То есть, ты делаешь COMMIT после EXECUTE PROCEDURE - и "не работает"? Враньё. Или ты не ту транзакцию коммитишь. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2020, 22:31 |
|
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
|
|||
---|---|---|---|
#18+
ёёёёёИли ты не ту транзакцию коммитишь. У ODBC всего одна транзакция, промахнуться невозможно. Вопрос в том "а коммитит ли он её"? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2020, 23:11 |
|
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov ёёёёёИли ты не ту транзакцию коммитишь. У ODBC всего одна транзакция, промахнуться невозможно. Вопрос в том "а коммитит ли он её"? Ну так он написал "то же самое" - врёт? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.02.2020, 18:18 |
|
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
|
|||
---|---|---|---|
#18+
ёёёёёврёт? "Добросовестно заблуждается." Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.02.2020, 18:28 |
|
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
|
|||
---|---|---|---|
#18+
Вот что я делаю. Подключаюсь к БД IBExpert'ом и third party приложением (TP) 1. a) В TP приложении выполняю (команды условные) Код: sql 1. 2.
b) в IBExpert'e обновляю таблицу (зелёная галочка Commit Transaction) - получаю только что записанные данные с) В TP приложении выполняю Код: sql 1. 2.
d) в IBExpert'e обновляю таблицу - не получаю только что записанные данные 2. В IBExpert'e a) через ODBC Viewer выполняю INSERT b) обновляю таблицу - получаю только что записанные данные c) через ODBC Viewer выполняю EXECUTE PROCEDURE d) обновляю таблицу - не получаю только что записанные данные e) выполняю INSERT или UPDATE (даже в другую таблицу) f) обновляю таблицу - получаю данные, записанные через EXECUTE PROCEDURE В IBExpert'e вы и сами (при желании) можете проверить, чтобы убедиться. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.02.2020, 21:04 |
|
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
|
|||
---|---|---|---|
#18+
Jarz, какой конкретно ODBC драйвер используется? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.02.2020, 21:19 |
|
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
|
|||
---|---|---|---|
#18+
JarzВ IBExpert'e вы и сами (при желании) можете проверить, чтобы убедиться. Вот только желания нет. Включай аудит в Firebird и смотри какие запросы и в каких транзакциях выполняются. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.02.2020, 22:12 |
|
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
|
|||
---|---|---|---|
#18+
Jarz c) через ODBC Viewer выполняю EXECUTE PROCEDURE d) обновляю таблицу - не получаю только что записанные данные ... |
|||
:
Нравится:
Не нравится:
|
|||
29.02.2020, 23:53 |
|
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
|
|||
---|---|---|---|
#18+
ёёёёё Jarz, какой конкретно ODBC драйвер используется? h__ps://firebirdsql.org/en/odbc-driver/ ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2020, 07:57 |
|
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov Включай аудит в Firebird и смотри какие запросы и в каких транзакциях выполняются. Включил. Посмотрел. - Если сделать INSERT/UPDATE, то транзакция коммитится сразу - Если сделать EXECUTE PROCEDURE, то транзакция не коммитится - При следующем UPDATE/INSERT транзакция коммитится ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2020, 11:22 |
|
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
|
|||
---|---|---|---|
#18+
Jarz, Возможно в object.commit() проверяется какой-нибудь флаг, который не выставляется должным образом в object.exec( "EXECUTE PROCEDURE ..." ); ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2020, 11:55 |
|
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
|
|||
---|---|---|---|
#18+
Vlad F, я сходу не нашел, какие операции завершаются коммитом при автокоммите. То ли это общее для ОДБЦ, то-ли driver-specific. Обычно в драйверах приавтокоммите однозначно завершаются коммитом insert, update и delete. Select - нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2020, 12:38 |
|
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
|
|||
---|---|---|---|
#18+
Vlad F Jarz, Возможно в object.commit() проверяется какой-нибудь флаг, который не выставляется должным образом в object.exec( "EXECUTE PROCEDURE ..." ); В IBExpert'овском ODBCViewer'е такое же поведение. kdv Vlad F, я сходу не нашел, какие операции завершаются коммитом при автокоммите. То ли это общее для ОДБЦ, то-ли driver-specific. Обычно в драйверах приавтокоммите однозначно завершаются коммитом insert, update и delete. Select - нет. SELECT'ов в вызываемой процедуре нет, suspend-ов - тоже. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2020, 13:06 |
|
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
|
|||
---|---|---|---|
#18+
Если что, у нас работает. Никогда проблем не наблюдали. Jarz, по-вашему получается, что хранимку с клиента вообще никак не запустить? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2020, 13:22 |
|
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
|
|||
---|---|---|---|
#18+
KreatorXXI, "по его" получается, что после execute procedure нет коммита при автокоммите. Только и всего. Надо явно вызывать коммит. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2020, 13:24 |
|
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2020, 13:28 |
|
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
|
|||
---|---|---|---|
#18+
kdv"по его" получается, что после execute procedure нет коммита при автокоммите. Только и всего. Надо явно вызывать коммит. Вот только он же утверждал, что явно вызывает коммит. Врал, наверное. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2020, 13:28 |
|
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
|
|||
---|---|---|---|
#18+
Мне кажется, дело всё-таки в драйвере. В документации написано: авторIf the BLR code for the stored procedure contains if (countSUSPEND == 1)... Then the ODBC driver will use execute procedure . ... If the BLR code for the stored procedure contains if (countSUSPEND > 1) as would be the case in this stored procedure definition: Then the ODBC Driver will use select * from Я порылся в исходниках: действительно, именно так и происходит. Определяется это в функции Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Только вот в исходниках Firebird у функции print_blr всего 3 параметра. А наиболее близкой является функция isc_print_blr . Возможно, из-за этого драйвер всегда подставляет "select *" . Подтвердить я это пока не могу, т.к. в трейс-логе отображается исходный текст запроса. Т.е. если я написал "ExEcuTe", то так в логе и будет. А итоговый я не знаю как посмотреть. Видимо, следующий этап - попытаться собрать модифицированный драйвер самому. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2020, 15:34 |
|
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
|
|||
---|---|---|---|
#18+
JarzА итоговый я не знаю как посмотреть. Повторяю медленно: включить аудит на стороне Firebird. Что ты якобы и сделал в https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1322814&msg=22090471 Тоже врал?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2020, 15:41 |
|
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
|
|||
---|---|---|---|
#18+
JarzВ документации написано: Это - для ODBC-шного синтаксиса "{?call ...}". А ты, если не врал, использовал прямой вызов EXECUTE PROCEDURE. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2020, 15:57 |
|
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
|
|||
---|---|---|---|
#18+
Jarz, вообще это какая-то лабуда и самодеятельность. Есть в процедуре suspend, или нет, ничто не запрещает выполнить execute procedure и получить результат. Один, как положено. Если же где-то внутри кто-то перекручивает вызов процедуры то так то эдак, по каким-то мутным критериям, то это его проблемы. Если процедура селективная, и надо выбрать оттуда набор записей, так и вызывать её надо как select from procedure, а не как execute procedure. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2020, 16:16 |
|
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
|
|||
---|---|---|---|
#18+
Jarz, и еще добавлю, что если кто-то в селективной процедуре пишет insert/update/delete, то это тоже его проблемы :-) И, явный коммит в драйвере должен работать, выполнялось вообще что-нибудь или нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2020, 16:19 |
|
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov JarzА итоговый я не знаю как посмотреть. Повторяю медленно: включить аудит на стороне Firebird. Что ты якобы и сделал в https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1322814&msg=22090471 Тоже врал?.. Вот что сделал я: 1. В файле firebird.config прописал путь к моему fbtrace.conf Код: sql 1.
2. В файле fbtrace.conf написал Код: sql 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. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44.
3. Перезапустил Firebird 4. Выполнил запрос "ExEcuTe PROCEDURE" 5. В логе увидел только "ExEcuTe PROCEDURE", хотя в исходниках драйвера запрос написан строчными буквами. Я, правда, не знаю - должен ли он ("драйверный" запрос) там появиться. Вполне возможно, что я сделал не то, что Вы подразумевали под аудитом. Или сделал неправильно. ### kdv Jarz, Если же где-то внутри кто-то перекручивает вызов процедуры то так то эдак, по каким-то мутным критериям, то это его проблемы. kdv Если процедура селективная, и надо выбрать оттуда набор записей, так и вызывать её надо как select from procedure, а не как execute procedure. ### Ладно, благодарю всех. Пока извернусь, а потом попробую драйвер пересобрать. Хотя бы чисто из спортивного интереса :) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2020, 16:49 |
|
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
|
|||
---|---|---|---|
#18+
JarzВполне возможно, что я сделал не то, что Вы подразумевали под аудитом. Или сделал неправильно. Да, ты сделал именно то, что я подразумевал. И раз ты увидел в логе только свой запрос, то должен был бы понять, что та часть кода ODBC драйвера, которую ты подозревал, не выполнялась. Что логично, поскольку она предназначена для интерпретации ODBC синтаксиса запросов. Значит теперь надо подозревать другие части кода ODBC драйвера (или приложений, включая IBExpert). Пересобрать драйвер из исходников - всегда хорошая идея, хотя бы потому, что то, что валяется в релизе, собиралось давно и с устаревшими заголовками. PS: Включить протоколирование ODBC чтобы видеть что творится "по эту сторону" - тоже хорошая идея. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2020, 17:49 |
|
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
|
|||
---|---|---|---|
#18+
Был неправ, что драйвер вызывает не ту функцию. Приношу всем извинения. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2020, 21:09 |
|
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
|
|||
---|---|---|---|
#18+
Извинения ни к чему. Лучше просто расскажи что именно было не так. Чтобы знать где грабли лежат. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2020, 23:02 |
|
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov Извинения ни к чему. Лучше просто расскажи что именно было не так. Чтобы знать где грабли лежат. В автокоммите Эта сладкая парочка - автостарт-автокоммит - просто неиссякаемый склад этого садового инвентаря. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2020, 23:07 |
|
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
|
|||
---|---|---|---|
#18+
Старый плюшевый мишкаВ автокоммите Ну так он же утверждал, что коммитил принудительно. Да и ODBC спеки говорят, что при автокоммите следует коммитить каждый запрос: https://docs.microsoft.com/en-us/sql/odbc/reference/develop-app/auto-commit-mode?view=sql-server-ver15 То есть это таки может быть баг в драйвере. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2020, 01:40 |
|
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov Извинения ни к чему. Лучше просто расскажи что именно было не так. Чтобы знать где грабли лежат. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2020, 08:02 |
|
|
start [/forum/topic.php?all=1&fid=40&tid=1560424]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
57ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
66ms |
get tp. blocked users: |
2ms |
others: | 11ms |
total: | 180ms |
0 / 0 |