powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
32 сообщений из 32, показаны все 2 страниц
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39932381
Jarz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Из стороннего (third party) приложения работаю с базой Firebird 3. Проблема следующая.

Если я выполняю запрос "INSERT ...", делаю commit, то новые данные становятся доступными сразу (например, в IBExpert'е).
Если же я выполняю запрос "EXECUTE PROCEDURE ...", которая делает то же самое, то новые данные становятся доступными только после отключения от базы в приложении.

P.S. Проверил в IBExpert'е с помощью ODBCViewer

Если выполнить "EXECUTE PROCEDURE ...", затем "INSERT" или "UPDATE" куда-нибудь (с коммитами), то данные обновляются.

Можно ли, какие и где параметры драйвера подкрутить, чтобы запрос "EXECUTE PROCEDURE ..." сразу нормально коммитился? Или другой способ, если драйвер не виноват.
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39932404
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://www.ibase.ru/transactions/
"Обязательное чтение."
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39932422
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jarz,

либо это есть в настройках драйвера (autocommit), либо облом без явного завершения транзакций.
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39932431
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jarz
Если я выполняю запрос "INSERT ...", делаю commit, то новые данные становятся доступными сразу (например, в IBExpert'е).
Если же я выполняю запрос "EXECUTE PROCEDURE ...", которая делает то же самое, то новые данные становятся доступными только после отключения от базы в приложении.

То есть, ты делаешь COMMIT после EXECUTE PROCEDURE - и "не работает"?

Враньё. Или ты не ту транзакцию коммитишь.
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39932438
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ёёёёёИли ты не ту транзакцию коммитишь.

У ODBC всего одна транзакция, промахнуться невозможно. Вопрос в том "а коммитит ли он её"?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39932557
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
ёёёёёИли ты не ту транзакцию коммитишь.

У ODBC всего одна транзакция, промахнуться невозможно. Вопрос в том "а коммитит ли он её"?
Ну так он написал "то же самое" - врёт?
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39932558
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ёёёёёврёт?

"Добросовестно заблуждается."
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39932579
Jarz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот что я делаю. Подключаюсь к БД IBExpert'ом и third party приложением (TP)

1.
a) В TP приложении выполняю (команды условные)
Код: sql
1.
2.
object.exec( "INSERT ..." );
object.commit();


b) в IBExpert'e обновляю таблицу (зелёная галочка Commit Transaction) - получаю только что записанные данные

с) В TP приложении выполняю
Код: sql
1.
2.
object.exec( "EXECUTE PROCEDURE ..." );
object.commit();


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 вы и сами (при желании) можете проверить, чтобы убедиться.
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39932581
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jarz,


какой конкретно ODBC драйвер используется?
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39932586
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JarzВ IBExpert'e вы и сами (при желании) можете проверить, чтобы убедиться.
Вот только желания нет. Включай аудит в Firebird и смотри какие запросы и в каких
транзакциях выполняются.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39932599
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jarz
c) через ODBC Viewer выполняю EXECUTE PROCEDURE
d) обновляю таблицу - не получаю только что записанные данные
А был ли мальчик ? Кто сказал, что EXECUTE PROCEDURE что-то куда-то записало ?
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39932851
Jarz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ёёёёё
Jarz,
какой конкретно ODBC драйвер используется?

h__ps://firebirdsql.org/en/odbc-driver/
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39932907
Jarz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov
Включай аудит в Firebird и смотри какие запросы и в каких
транзакциях выполняются.

Включил. Посмотрел.
- Если сделать INSERT/UPDATE, то транзакция коммитится сразу
- Если сделать EXECUTE PROCEDURE, то транзакция не коммитится
- При следующем UPDATE/INSERT транзакция коммитится
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39932921
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jarz,

Возможно в object.commit() проверяется какой-нибудь флаг, который не выставляется должным образом в object.exec( "EXECUTE PROCEDURE ..." );
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39932938
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad F,

я сходу не нашел, какие операции завершаются коммитом при автокоммите. То ли это общее для ОДБЦ, то-ли driver-specific.
Обычно в драйверах приавтокоммите однозначно завершаются коммитом insert, update и delete. Select - нет.
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39932955
Jarz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vlad F
Jarz,
Возможно в object.commit() проверяется какой-нибудь флаг, который не выставляется должным образом в object.exec( "EXECUTE PROCEDURE ..." );

В IBExpert'овском ODBCViewer'е такое же поведение.


kdv
Vlad F,
я сходу не нашел, какие операции завершаются коммитом при автокоммите. То ли это общее для ОДБЦ, то-ли driver-specific.
Обычно в драйверах приавтокоммите однозначно завершаются коммитом insert, update и delete. Select - нет.

SELECT'ов в вызываемой процедуре нет, suspend-ов - тоже.
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39932961
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если что, у нас работает. Никогда проблем не наблюдали. Jarz, по-вашему получается, что хранимку с клиента вообще никак не запустить?
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39932964
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI,

"по его" получается, что после execute procedure нет коммита при автокоммите. Только и всего. Надо явно вызывать коммит.
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39932965
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,

ну как же, вот здесь 22089856 явно он написан. object.commit() - это не явный коммит?
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39932966
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv"по его" получается, что после execute procedure нет коммита при автокоммите. Только и
всего. Надо явно вызывать коммит.

Вот только он же утверждал, что явно вызывает коммит. Врал, наверное.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39933041
Jarz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне кажется, дело всё-таки в драйвере. В документации написано:
автор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.
bool IscProceduresResultSet::canSelectFromProcedure()
{
...
	metaData->connection->GDS->_print_blr((char*)buffer,(void (*)())gen_blr, &countSUSPEND,0);
...
	return countSUSPEND > 1;
}

class CFbDll
{
...
	print_blr*					_print_blr;
}; 


Только вот в исходниках Firebird у функции print_blr всего 3 параметра. А наиболее близкой является функция isc_print_blr . Возможно, из-за этого драйвер всегда подставляет "select *" . Подтвердить я это пока не могу, т.к. в трейс-логе отображается исходный текст запроса. Т.е. если я написал "ExEcuTe", то так в логе и будет. А итоговый я не знаю как посмотреть.

Видимо, следующий этап - попытаться собрать модифицированный драйвер самому.
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39933050
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JarzА итоговый я не знаю как посмотреть.

Повторяю медленно: включить аудит на стороне Firebird. Что ты якобы и сделал в
https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1322814&msg=22090471
Тоже врал?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39933064
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JarzВ документации написано:

Это - для ODBC-шного синтаксиса "{?call ...}". А ты, если не врал, использовал прямой
вызов EXECUTE PROCEDURE.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39933081
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jarz,

вообще это какая-то лабуда и самодеятельность. Есть в процедуре suspend, или нет, ничто не запрещает выполнить execute procedure и получить результат. Один, как положено.
Если же где-то внутри кто-то перекручивает вызов процедуры то так то эдак, по каким-то мутным критериям, то это его проблемы.
Если процедура селективная, и надо выбрать оттуда набор записей, так и вызывать её надо как select from procedure, а не как execute procedure.
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39933084
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jarz,

и еще добавлю, что если кто-то в селективной процедуре пишет insert/update/delete, то это тоже его проблемы :-)
И, явный коммит в драйвере должен работать, выполнялось вообще что-нибудь или нет.
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39933113
Jarz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

JarzА итоговый я не знаю как посмотреть.

Повторяю медленно: включить аудит на стороне Firebird. Что ты якобы и сделал в
https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1322814&msg=22090471
Тоже врал?..
Вот что сделал я:

1. В файле firebird.config прописал путь к моему fbtrace.conf
Код: sql
1.
AuditTraceConfigFile = c:\temp\fbtrace.conf


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.
database = c:\\test\\test.fdb
{
	# Do we trace database events or not
	enabled = true

	# Operations log file name. For use by system audit trace only
	log_filename = c:\\test\\test.log

	# Put attach/detach log records 
	log_connections = true

	# Put transaction start/end records 
	log_transactions = true

	# Put sql statement prepare records 
	log_statement_prepare = true

	# Put sql statement free records 
	log_statement_free = true

	# Put sql statement execution start records 
	log_statement_start = true
	
	# Put sql statement execution finish\fetch to eof records 
	log_statement_finish = true

	# Put record when stored procedure is start execution 
	log_procedure_start = true

	# Put record when stored procedure is finish execution 
	log_procedure_finish = true

	# Put record when stored function is start execution 
	log_function_start = true

	# Put record when stored function is finish execution 
	log_function_finish = true

	# Put blr requests compile/execute records 
	log_blr_requests = true

	# Print blr requests or not
	print_blr = true
}


3. Перезапустил Firebird
4. Выполнил запрос "ExEcuTe PROCEDURE"
5. В логе увидел только "ExEcuTe PROCEDURE", хотя в исходниках драйвера запрос написан строчными буквами. Я, правда, не знаю - должен ли он ("драйверный" запрос) там появиться.

Вполне возможно, что я сделал не то, что Вы подразумевали под аудитом. Или сделал неправильно.

###

kdv
Jarz,
Если же где-то внутри кто-то перекручивает вызов процедуры то так то эдак, по каким-то мутным критериям, то это его проблемы.
В данном случае - мои тоже, т.к. от ODBC-драйвера отказаться по ряду причин нет возможности, а у меня подозрения , что виноват именно драйвер.

kdv
Если процедура селективная, и надо выбрать оттуда набор записей, так и вызывать её надо как select from procedure, а не как execute procedure.
Процедура неселективная. Впрочем, свою догадку я уже объяснил.

###

Ладно, благодарю всех. Пока извернусь, а потом попробую драйвер пересобрать. Хотя бы чисто из спортивного интереса :)
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39933154
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JarzВполне возможно, что я сделал не то, что Вы подразумевали под аудитом. Или сделал неправильно.

Да, ты сделал именно то, что я подразумевал. И раз ты увидел в логе только свой запрос, то
должен был бы понять, что та часть кода ODBC драйвера, которую ты подозревал, не
выполнялась. Что логично, поскольку она предназначена для интерпретации ODBC синтаксиса
запросов. Значит теперь надо подозревать другие части кода ODBC драйвера (или приложений,
включая IBExpert).

Пересобрать драйвер из исходников - всегда хорошая идея, хотя бы потому, что то, что
валяется в релизе, собиралось давно и с устаревшими заголовками.

PS: Включить протоколирование ODBC чтобы видеть что творится "по эту сторону" - тоже
хорошая идея.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39933210
Jarz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Был неправ, что драйвер вызывает не ту функцию. Приношу всем извинения.
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39933236
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извинения ни к чему. Лучше просто расскажи что именно было не так. Чтобы знать где грабли
лежат.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39933237
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Извинения ни к чему. Лучше просто расскажи что именно было не так. Чтобы знать где грабли
лежат.


В автокоммите Эта сладкая парочка - автостарт-автокоммит - просто неиссякаемый склад этого садового инвентаря.
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39933260
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Старый плюшевый мишкаВ автокоммите

Ну так он же утверждал, что коммитил принудительно. Да и 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
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39933284
Jarz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

Извинения ни к чему. Лучше просто расскажи что именно было не так. Чтобы знать где грабли
лежат.
Где грабли лежат - не знаю. Просто при попытке пересобрать драйвер я понял, что был невнимателен.
...
Рейтинг: 0 / 0
32 сообщений из 32, показаны все 2 страниц
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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