Начало » Использование СУБД » 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] Известить модератора
|
|
|
|
Re: ALTER SESSION RESET [сообщение #2501 является ответом на сообщение #2500] |
Fri, 09 June 2023 13:01 |
Dmitry Kovalenko
Сообщений: 51 Зарегистрирован: December 2022
|
Member |
|
|
hvlad писал(а) Fri, 09 June 2023 12:16Dmitry 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.
|
|
|
|
|
|
|
|
Переход к форуму:
Текущее время: Thu Dec 26 10:14:12 GMT+3 2024
Общее время, затраченное на создание страницы: 0.01355 секунд
|