Начало » Использование СУБД » Firebird, HQbird, InterBase » ALTER SESSION RESET (и неявное закрытие курсоров)
ALTER SESSION RESET [сообщение #2499] |
Fri, 09 June 2023 11:48 |
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] Известить модератора
|
|
|
Переход к форуму:
Текущее время: Thu Dec 26 22:59:17 GMT+3 2024
Общее время, затраченное на создание страницы: 0.01104 секунд
|