SQLRU.net
Разработка приложений баз данных

Начало » Использование СУБД » Firebird, HQbird, InterBase » ALTER SESSION RESET (и неявное закрытие курсоров)
ALTER SESSION RESET [сообщение #2499] Fri, 09 June 2023 11:48 Переход к следующему сообщению
Dmitry Kovalenko в настоящее время не в онлайне  Dmitry Kovalenko
Сообщений: 51
Зарегистрирован: December 2022
Member
С пятницей, коллеги.

Игрался с "ALTER SESSION RESET" (FB4+fbclient).

Лично убедился, что если его выполнять в транзакции, то она будет перезапущена.

Побочный эффект от этого перезапуска - происходит (неявное) закрытие курсоров, открытых в этой транзакции.

После этого с этими курсорами возникают траблы.

Если продолжить фетчить - будет ошибка "invalid request handle".

Если закрыть/открыть - будет ошибка курсор уже был открыт.

Выглядит это так (лучше изучать в Notepad++ с его подсветкой одинаковых лексем):

ISC_API_IN [#000001]: isc_dsql_allocate_statement(...,db_handle=&db00000001,stmt_handle=&stmt00000000)
ISC_API_OUT[#000001]: isc_dsql_allocate_statement(...,db_handle=&db00000001,stmt_handle=&stmt00000001) return OK.
ISC_API_IN [#000002]: isc_dsql_prepare_m(...,tr_handle=&tr00000000,stmt_handle=&stmt00000001,...)
[stmt_text len:0]
set transaction
[/stmt_text]
ISC_API_OUT[#000002]: isc_dsql_prepare_m(...,tr_handle=&tr00000000,stmt_handle=&stmt00000001,...) return OK.
ISC_API_IN [#000003]: isc_dsql_execute2_m(...,tr_handle=&tr00000000,stmt_handle=&stmt00000001,...)
ISC_API_OUT[#000003]: isc_dsql_execute2_m(...,tr_handle=&tr00000001,stmt_handle=&stmt00000001,...) return OK.
ISC_API_IN [#000004]: isc_dsql_allocate_statement(...,db_handle=&db00000001,stmt_handle=&stmt00000000)
ISC_API_OUT[#000004]: isc_dsql_allocate_statement(...,db_handle=&db00000001,stmt_handle=&stmt00000002) return OK.
ISC_API_IN [#000005]: isc_dsql_prepare_m(...,tr_handle=&tr00000001,stmt_handle=&stmt00000002,...)
[stmt_text len:0]
select * from rdb$fields
[/stmt_text]
ISC_API_OUT[#000005]: isc_dsql_prepare_m(...,tr_handle=&tr00000001,stmt_handle=&stmt00000002,...) return OK.
ISC_API_IN [#000006]: isc_dsql_execute2_m(...,tr_handle=&tr00000001,stmt_handle=&stmt00000002,...)
ISC_API_OUT[#000006]: isc_dsql_execute2_m(...,tr_handle=&tr00000001,stmt_handle=&stmt00000002,...) return OK.
ISC_API_IN [#000007]: isc_dsql_allocate_statement(...,db_handle=&db00000001,stmt_handle=&stmt00000000)
ISC_API_OUT[#000007]: isc_dsql_allocate_statement(...,db_handle=&db00000001,stmt_handle=&stmt00000003) return OK.
ISC_API_IN [#000008]: isc_dsql_prepare_m(...,tr_handle=&tr00000001,stmt_handle=&stmt00000003,...)
[stmt_text len:0]
alter session reset
[/stmt_text]
ISC_API_OUT[#000008]: isc_dsql_prepare_m(...,tr_handle=&tr00000001,stmt_handle=&stmt00000003,...) return OK.
ISC_API_IN [#000009]: isc_dsql_free_statement(...,stmt_handle=&stmt00000001,2)
ISC_API_OUT[#000009]: isc_dsql_free_statement(...,stmt_handle=&stmt00000000,2) return OK.
ISC_API_IN [#000010]: isc_dsql_execute2_m(...,tr_handle=&tr00000001,stmt_handle=&stmt00000003,...)
ISC_API_OUT[#000010]: isc_dsql_execute2_m(...,tr_handle=&tr00000001,stmt_handle=&stmt00000003,...) return OK.
ISC_API_IN [#000011]: isc_dsql_fetch_m(...,stmt_handle=&stmt00000002,...)
ISC_API_OUT[#000011]: isc_dsql_fetch_m(...,stmt_handle=&stmt00000002,...) return ERROR [335544327]
invalid request handle
ISC_API_IN [#000012]: isc_dsql_free_statement(...,stmt_handle=&stmt00000002,1)
ISC_API_OUT[#000012]: isc_dsql_free_statement(...,stmt_handle=&stmt00000002,1) return OK.
ISC_API_IN [#000013]: isc_dsql_execute2_m(...,tr_handle=&tr00000001,stmt_handle=&stmt00000002,...)
ISC_API_OUT[#000013]: isc_dsql_execute2_m(...,tr_handle=&tr00000001,stmt_handle=&stmt00000002,...) return OK.
ISC_API_IN [#000014]: isc_dsql_fetch_m(...,stmt_handle=&stmt00000002,...)
ISC_API_OUT[#000014]: isc_dsql_fetch_m(...,stmt_handle=&stmt00000002,...) return ERROR [335544436]
SQL error code = -502
Attempt to reopen an open cursor
ISC_API_IN [#000015]: isc_dsql_free_statement(...,stmt_handle=&stmt00000003,2)
ISC_API_OUT[#000015]: isc_dsql_free_statement(...,stmt_handle=&stmt00000000,2) return OK.
Если мучить сервер напрямую (без fbclient), то перед "Attempt to reopen an open cursor" обнаружиться задавленная ошибка "закрытия закрытого курсора" (тут, в общем, понятно).

Не понятно вот это "Attempt to reopen an open cursor".

Я вот, после второго стакана, чего думаю - может лучше было бы чтобы "ALTER SESSION RESET" выкидывал ошибку, если в его транзакции есть незакрытые курсоры?

В целом, все эти "проблемы" я у себя порешал, так что этот пост был написано просто для развлечения.

[Обновления: Fri, 09 June 2023 12:35]

Известить модератора

Re: ALTER SESSION RESET [сообщение #2500 является ответом на сообщение #2499] Fri, 09 June 2023 12:16 Переход к предыдущему сообщениюПереход к следующему сообщению
hvlad в настоящее время не в онлайне  hvlad
Сообщений: 364
Зарегистрирован: August 2022
Senior Member
Dmitry Kovalenko писал(а) Fri, 09 June 2023 11:48
Не понятно вот это "Attempt to reopen an open cursor".
А с embedded не пробовал ?

Dmitry Kovalenko
Я вот, после второго стакана, чего думаю - может лучше было бы чтобы "ALTER SESSION RESET" выкидывал ошибку, если в его транзакции есть незакрытые курсоры?
Хороший вопрос, жаль возник поздновато.
Re: ALTER SESSION RESET [сообщение #2501 является ответом на сообщение #2500] Fri, 09 June 2023 13:01 Переход к предыдущему сообщениюПереход к следующему сообщению
Dmitry Kovalenko в настоящее время не в онлайне  Dmitry Kovalenko
Сообщений: 51
Зарегистрирован: December 2022
Member
hvlad писал(а) Fri, 09 June 2023 12:16
Dmitry Kovalenko писал(а) Fri, 09 June 2023 11:48
Не понятно вот это "Attempt to reopen an open cursor".
А с embedded не пробовал ?
Попробовал вот.

[#000012] Это сначала верхний уровень (сам OLEDB провайдер) пытается закрыть курсор. Получает ошибку и просто отказывается от этого объекта.
[#000013] Потом внизу пытаются закрыть курсор и поместить запрос в пул запросов. Получают ошибку.
[#000014] После этого пытаются вообще дропнуть запрос. Снова ошибка. И вот это вот реально странно.

Ну и после всего этого будет создан новый запрос - stmt0000000000000004. С ним все норм.

ISC_API_IN [#000001]: isc_dsql_allocate_statement(...,db_handle=&db0000000000000002,stmt_handle=&stmt0000000000000000)
ISC_API_OUT[#000001]: isc_dsql_allocate_statement(...,db_handle=&db0000000000000002,stmt_handle=&stmt0000000000000001) return OK.
ISC_API_IN [#000002]: isc_dsql_prepare_m(...,tr_handle=&tr0000000000000000,stmt_handle=&stmt0000000000000001,...)
[stmt_text len:0]
set transaction
[/stmt_text]
ISC_API_OUT[#000002]: isc_dsql_prepare_m(...,tr_handle=&tr0000000000000000,stmt_handle=&stmt0000000000000001,...) return OK.
ISC_API_IN [#000003]: isc_dsql_execute2_m(...,tr_handle=&tr0000000000000000,stmt_handle=&stmt0000000000000001,...)
ISC_API_OUT[#000003]: isc_dsql_execute2_m(...,tr_handle=&tr0000000000000001,stmt_handle=&stmt0000000000000001,...) return OK.
ISC_API_IN [#000004]: isc_dsql_allocate_statement(...,db_handle=&db0000000000000002,stmt_handle=&stmt0000000000000000)
ISC_API_OUT[#000004]: isc_dsql_allocate_statement(...,db_handle=&db0000000000000002,stmt_handle=&stmt0000000000000002) return OK.
ISC_API_IN [#000005]: isc_dsql_prepare_m(...,tr_handle=&tr0000000000000001,stmt_handle=&stmt0000000000000002,...)
[stmt_text len:0]
select * from rdb$fields
[/stmt_text]
ISC_API_OUT[#000005]: isc_dsql_prepare_m(...,tr_handle=&tr0000000000000001,stmt_handle=&stmt0000000000000002,...) return OK.
ISC_API_IN [#000006]: isc_dsql_execute2_m(...,tr_handle=&tr0000000000000001,stmt_handle=&stmt0000000000000002,...)
ISC_API_OUT[#000006]: isc_dsql_execute2_m(...,tr_handle=&tr0000000000000001,stmt_handle=&stmt0000000000000002,...) return OK.
ISC_API_IN [#000007]: isc_dsql_allocate_statement(...,db_handle=&db0000000000000002,stmt_handle=&stmt0000000000000000)
ISC_API_OUT[#000007]: isc_dsql_allocate_statement(...,db_handle=&db0000000000000002,stmt_handle=&stmt0000000000000003) return OK.
ISC_API_IN [#000008]: isc_dsql_prepare_m(...,tr_handle=&tr0000000000000001,stmt_handle=&stmt0000000000000003,...)
[stmt_text len:0]
alter session reset
[/stmt_text]
ISC_API_OUT[#000008]: isc_dsql_prepare_m(...,tr_handle=&tr0000000000000001,stmt_handle=&stmt0000000000000003,...) return OK.
ISC_API_IN [#000009]: isc_dsql_free_statement(...,stmt_handle=&stmt0000000000000001,2)
ISC_API_OUT[#000009]: isc_dsql_free_statement(...,stmt_handle=&stmt0000000000000000,2) return OK.
ISC_API_IN [#000010]: isc_dsql_execute2_m(...,tr_handle=&tr0000000000000001,stmt_handle=&stmt0000000000000003,...)
ISC_API_OUT[#000010]: isc_dsql_execute2_m(...,tr_handle=&tr0000000000000001,stmt_handle=&stmt0000000000000003,...) return OK.
ISC_API_IN [#000011]: isc_dsql_fetch_m(...,stmt_handle=&stmt0000000000000002,...)
ISC_API_OUT[#000011]: isc_dsql_fetch_m(...,stmt_handle=&stmt0000000000000002,...) return ERROR [335544327]
invalid request handle
ISC_API_IN [#000012]: isc_dsql_free_statement(...,stmt_handle=&stmt0000000000000002,1)
ISC_API_OUT[#000012]: isc_dsql_free_statement(...,stmt_handle=&stmt0000000000000002,1) return ERROR [335544327]
invalid request handle
ISC_API_IN [#000013]: isc_dsql_free_statement(...,stmt_handle=&stmt0000000000000002,1)
ISC_API_OUT[#000013]: isc_dsql_free_statement(...,stmt_handle=&stmt0000000000000002,1) return ERROR [335544327]
invalid request handle
ISC_API_IN [#000014]: isc_dsql_free_statement(...,stmt_handle=&stmt0000000000000002,2)
ISC_API_OUT[#000014]: isc_dsql_free_statement(...,stmt_handle=&stmt0000000000000002,2) return ERROR [335544327]
invalid request handle
ISC_API_IN [#000015]: isc_dsql_allocate_statement(...,db_handle=&db0000000000000002,stmt_handle=&stmt0000000000000000)
ISC_API_OUT[#000015]: isc_dsql_allocate_statement(...,db_handle=&db0000000000000002,stmt_handle=&stmt0000000000000004) return OK.
ISC_API_IN [#000016]: isc_dsql_prepare_m(...,tr_handle=&tr0000000000000001,stmt_handle=&stmt0000000000000004,...)
[stmt_text len:0]
select * from rdb$fields
[/stmt_text]
ISC_API_OUT[#000016]: isc_dsql_prepare_m(...,tr_handle=&tr0000000000000001,stmt_handle=&stmt0000000000000004,...) return OK.
ISC_API_IN [#000017]: isc_dsql_execute2_m(...,tr_handle=&tr0000000000000001,stmt_handle=&stmt0000000000000004,...)
ISC_API_OUT[#000017]: isc_dsql_execute2_m(...,tr_handle=&tr0000000000000001,stmt_handle=&stmt0000000000000004,...) return OK.
ISC_API_IN [#000018]: isc_dsql_fetch_m(...,stmt_handle=&stmt0000000000000004,...)
ISC_API_OUT[#000018]: isc_dsql_fetch_m(...,stmt_handle=&stmt0000000000000004,...) return OK.
ISC_API_IN [#000019]: isc_dsql_free_statement(...,stmt_handle=&stmt0000000000000003,2)
ISC_API_OUT[#000019]: isc_dsql_free_statement(...,stmt_handle=&stmt0000000000000000,2) return OK.
Re: ALTER SESSION RESET [сообщение #2502 является ответом на сообщение #2501] Fri, 09 June 2023 14:22 Переход к предыдущему сообщениюПереход к следующему сообщению
SD в настоящее время не в онлайне  SD
Сообщений: 417
Зарегистрирован: August 2022
Senior Member
Вообще-то этот запрос предназначен вызываться вне транзакции. По-моему он должен был бы ругаться если запущен внутри.
Re: ALTER SESSION RESET [сообщение #2503 является ответом на сообщение #2502] Fri, 09 June 2023 14:26 Переход к предыдущему сообщениюПереход к следующему сообщению
Dmitry Kovalenko в настоящее время не в онлайне  Dmitry Kovalenko
Сообщений: 51
Зарегистрирован: December 2022
Member
SD писал(а) Fri, 09 June 2023 14:22
Вообще-то этот запрос предназначен вызываться вне транзакции. По-моему он должен был бы ругаться если запущен внутри.
Да, его можно подготовить и выполнить без транзакции.
Re: ALTER SESSION RESET [сообщение #2520 является ответом на сообщение #2501] Sat, 10 June 2023 00:27 Переход к предыдущему сообщениюПереход к следующему сообщению
hvlad в настоящее время не в онлайне  hvlad
Сообщений: 364
Зарегистрирован: August 2022
Senior Member
Закинь в трекер, плс, на всякий. Чтобы не потерялось.
Re: ALTER SESSION RESET [сообщение #2521 является ответом на сообщение #2520] Sat, 10 June 2023 01:55 Переход к предыдущему сообщениюПереход к следующему сообщению
Dmitry Kovalenko в настоящее время не в онлайне  Dmitry Kovalenko
Сообщений: 51
Зарегистрирован: December 2022
Member
hvlad писал(а) Sat, 10 June 2023 00:27
Закинь в трекер, плс, на всякий. Чтобы не потерялось.
https://github.com/FirebirdSQL/firebird/issues/7625

I did my best.
Re: ALTER SESSION RESET [сообщение #2522 является ответом на сообщение #2521] Sat, 10 June 2023 11:41 Переход к предыдущему сообщению
hvlad в настоящее время не в онлайне  hvlad
Сообщений: 364
Зарегистрирован: August 2022
Senior Member
Спасибо
Предыдущая тема: FB 4 Сервисы и кириллица
Следующая тема: Адреса в приложениях.
Переход к форуму:
  


Текущее время: Sun Dec 22 10:03:15 GMT+3 2024

Общее время, затраченное на создание страницы: 0.00731 секунд