powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / проблема с CREATE OR ALTER PROCEDURE (в 3.0) - где смотреть?
21 сообщений из 21, страница 1 из 1
проблема с CREATE OR ALTER PROCEDURE (в 3.0) - где смотреть?
    #39230062
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
После использования селективной процедуры и коммита транзакции (RCRW), попытка CREATE OR ALTER PROCEDURE завершается с ошибкой. Вернее, ошибка появляется при попытке коммита новой RCRW транзакции, в котором выполнился без ошибок этот стейтмент. Текст ошибки:

Cannot commit transaction:
Unsuccessful execution caused by system error that does not preclude successful execution of subsequent statements.
lock conflict on no wait transaction.
unsuccessful metadata update.
object PROCEDURE "имя процедуры" is in use

После этого делаю роллбэк.

Перед этим всем (стартом транзакции для обновления процедуры) и после роллбэка её:

1.

SELECT * FROM MON$TRANSACTIONS M
WHERE M.MON$TRANSACTION_ID <> CURRENT_TRANSACTION
(в IBE)

показывает только ридонли транзакции (MON$READ_ONLY=1 у всех открытых)

2.

В MON$STATEMENTS нет стейтментов с использованием этой процедуры.

Вопрос: где еще смотреть?

Да, с помощью "чистого IBE" повторить проблему не могу - делаю SELECT из процедуры, комит, CREATE OR ALTER..., комит - все отрабатывает отлично. Правда, если запустить мою программу и вызвать процедуру там - в IBE CREATE OR ALTER+коммит тоже не проходит с той же ошибкой.
Т.ч. пока грешу на свой старый IBX, который что-то недозакрывает, видимо.
Может, кто сталкивался.
...
Рейтинг: 0 / 0
проблема с CREATE OR ALTER PROCEDURE (в 3.0) - где смотреть?
    #39230089
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,

1. абсолютно пофиг readonly или нет
2. нигде не посмотришь.

YuRockТ.ч. пока грешу на свой старый IBX, который что-то недозакрывает, видимо.

закрывать то он может и закрывает, а вот unprepare не делает
...
Рейтинг: 0 / 0
проблема с CREATE OR ALTER PROCEDURE (в 3.0) - где смотреть?
    #39230122
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockon no wait transactionиспользую wait транзакцию. Да, я понимаю, что "выдергиваю табуретку из-под задницы сидящего", но тем не менее работает. :)
...
Рейтинг: 0 / 0
проблема с CREATE OR ALTER PROCEDURE (в 3.0) - где смотреть?
    #39230187
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис1. абсолютно пофиг readonly или нет
Да это я так, на всяк. случай написал.
Симонов Денисзакрывать то он может и закрывает, а вот unprepare не делает
А что должно делаться в unprepare?
Я тут глянул, во всех объектах наследниках датасета моего IBX в деструкторе вызывается метод Unprepare, в нем - InternalUnPrepare, а в нем ничего толком не вызывается - только очистка локальных буфферов:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
procedure TIBCustomDataSet.InternalUnPrepare;
begin
  if FInternalPrepared then
  begin
    CheckDatasetClosed; // тут просто raise exception если не открыто
    FieldDefs.Clear;
    FInternalPrepared := False;
    FLiveMode := [];
  end;
end;


Т.е. никаких ф-ций клиента не вызывается. А какая-то должна? Если да - какая?
...
Рейтинг: 0 / 0
проблема с CREATE OR ALTER PROCEDURE (в 3.0) - где смотреть?
    #39230198
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_Pisarevskyиспользую wait транзакцию. Да, я понимаю, что "выдергиваю табуретку из-под задницы сидящего", но тем не менее работает. :)
Блин. У меня так тоже заработало.
Это мне не нравится
...
Рейтинг: 0 / 0
проблема с CREATE OR ALTER PROCEDURE (в 3.0) - где смотреть?
    #39230201
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
проблема с CREATE OR ALTER PROCEDURE (в 3.0) - где смотреть?
    #39230205
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисYuRock,
я имел ввиду http://www.firebirdsql.org/file/documentation/release_notes/html/rlsnotes255.html#rnfb25-apiods-api-unprpr
А, ясно. У меня делается DSQL_drop - этого должно быть достаточно.
Т.ч. это не должно влиять. Я ж говорю - стейтмента вообще нет.
...
Рейтинг: 0 / 0
проблема с CREATE OR ALTER PROCEDURE (в 3.0) - где смотреть?
    #39230207
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockIvan_Pisarevskyиспользую wait транзакцию. Да, я понимаю, что "выдергиваю табуретку из-под задницы сидящего", но тем не менее работает. :)
Блин. У меня так тоже заработало.
Это мне не нравится
Может кто объяснить, что происходит?
Как могут свойства транзакции wait/nowait влиять на object in use? Если транзакция, которая действительно его юзала, закоммитилась перед тем, как стартует новая?
Вообще это глюк или фича?
...
Рейтинг: 0 / 0
проблема с CREATE OR ALTER PROCEDURE (в 3.0) - где смотреть?
    #39230212
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,

ну значит не оно. По идее не хватает таблицы мониторинга которая показывала что есть в кеше метаданных и используется ли оно.
...
Рейтинг: 0 / 0
проблема с CREATE OR ALTER PROCEDURE (в 3.0) - где смотреть?
    #39230215
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,

вроде бы wait/nowait влияет только на то где выполняется CREATE OR ALTER PROCEDURE

И это не только в 3.0
...
Рейтинг: 0 / 0
проблема с CREATE OR ALTER PROCEDURE (в 3.0) - где смотреть?
    #39230217
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисYuRock,

вроде бы wait/nowait влияет только на то где выполняется CREATE OR ALTER PROCEDURE

И это не только в 3.0
Проблема только в 3.0 у меня появилась. На 2.1 и ниже не было. 2.5 не использовал.
Да, если транзакцию, которая вызывает CREATE OR ALTER PROCEDURE, сделать wait - все начинает работать.
Только как это объяснить, не знаю.
...
Рейтинг: 0 / 0
проблема с CREATE OR ALTER PROCEDURE (в 3.0) - где смотреть?
    #39230276
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockВообще это глюк или фича?
Вот нашел в треккере пару ссылок:
http://tracker.firebirdsql.org/browse/CORE-4016 (закрыто как дубликат)
и
http://tracker.firebirdsql.org/browse/CORE-3108

Но они, я так понял, для классика. А у меня SS.
...
Рейтинг: 0 / 0
проблема с CREATE OR ALTER PROCEDURE (в 3.0) - где смотреть?
    #39230281
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,

потому что в 3.0 в отличии от 2.x у SS нет общего кеша метаданных. Там только общий страничный кеш.
Когда он будет сделан хз. Обещаний сделать в 4.0 не было
...
Рейтинг: 0 / 0
проблема с CREATE OR ALTER PROCEDURE (в 3.0) - где смотреть?
    #39230285
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мда, вот еще такая история описана Дмитрием Емановым:
https://sourceforge.net/p/firebird/mailman/message/32523570/

Правда на классике 2.5.
И, по прочтению, так и не понятно, какое логическое отношение WAIT/NOWAIT имеет к object in use.
Только такая фраза:

All you need to do is to use a WAIT transaction to perform DDL for
procedures (including ALTER PROCEDURE). When using a NOWAIT transaction
to alter procedures, this is expected to get an "object in use" error.
Dmitry
...
Рейтинг: 0 / 0
проблема с CREATE OR ALTER PROCEDURE (в 3.0) - где смотреть?
    #39230286
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисв 3.0 в отличии от 2.x у SS нет общего кеша метаданных. Там только общий страничный кеш.
Да, я так уже и подумал.
...
Рейтинг: 0 / 0
проблема с CREATE OR ALTER PROCEDURE (в 3.0) - где смотреть?
    #39230290
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, я так понял, wait для alter procedure - это давняя "фича", которая что-то дополнительно делает, благодаря чему и работает.
...
Рейтинг: 0 / 0
проблема с CREATE OR ALTER PROCEDURE (в 3.0) - где смотреть?
    #39230306
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисYuRock,

потому что в 3.0 в отличии от 2.x у SS нет общего кеша метаданных. Там только общий страничный кеш.
Когда он будет сделан хз. Обещаний сделать в 4.0 не было

небольшие уточнения 17749760
...
Рейтинг: 0 / 0
проблема с CREATE OR ALTER PROCEDURE (в 3.0) - где смотреть?
    #39230364
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockИ, по прочтению, так и не понятно, какое логическое отношение WAIT/NOWAIT имеет к object in use.
локи метаданных кешируются коннектом. Т.е. даже если процедура уже не используется (use_count = 0), коннект все равно держит на нее SH-лок. Это оптимизация такая, чтобы снизить нагрузку на лок-менеджер. Отпускается оный лок по АСТу (читай: сигналу) от любого другого коннекта, который захочет взять несовместимый лок (при ALTER/DROP берется EX-лок). Вот только оный сигнал посылается лишь если лок берется с таймаутом. Если же NOWAIT (сиречь timeout = 0), то просто проверяется состояние в лок-таблице и возвращается облом. Ибо любой другой вариант взаимодействия с процессом А приведет к ненулевой задержке. Вот такая особенность реализации. Поэтому при WAIT все работает, а при NOWAIT - фигвам.
...
Рейтинг: 0 / 0
проблема с CREATE OR ALTER PROCEDURE (в 3.0) - где смотреть?
    #39230469
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr,

Спасибо, раз это штатное поведение, то подходит.
...
Рейтинг: 0 / 0
проблема с CREATE OR ALTER PROCEDURE (в 3.0) - где смотреть?
    #39230534
Фотография CyberMax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr,

А если use_count > 1, то что произойдет при обновлении в WAIT-транзакции?
...
Рейтинг: 0 / 0
проблема с CREATE OR ALTER PROCEDURE (в 3.0) - где смотреть?
    #39230647
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CyberMaxА если use_count > 1, то что произойдет при обновлении в WAIT-транзакции?
для таблицы - отлуп с "object in use". Для процедуры - обновление спокойно пройдет и создаст новую версию процедуры. Старая будет болтаться в памяти (и выполняться старыми скомпилированными запросами) до тех пор, пока ее счетчик использования не обнулится. После чего она будет прибита.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / проблема с CREATE OR ALTER PROCEDURE (в 3.0) - где смотреть?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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