Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / проблема с CREATE OR ALTER PROCEDURE (в 3.0) - где смотреть? / 21 сообщений из 21, страница 1 из 1
05.05.2016, 16:13
    #39230062
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с CREATE OR ALTER PROCEDURE (в 3.0) - где смотреть?
После использования селективной процедуры и коммита транзакции (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
05.05.2016, 16:28
    #39230089
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с CREATE OR ALTER PROCEDURE (в 3.0) - где смотреть?
YuRock,

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

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

закрывать то он может и закрывает, а вот unprepare не делает
...
Рейтинг: 0 / 0
05.05.2016, 16:39
    #39230122
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с CREATE OR ALTER PROCEDURE (в 3.0) - где смотреть?
YuRockon no wait transactionиспользую wait транзакцию. Да, я понимаю, что "выдергиваю табуретку из-под задницы сидящего", но тем не менее работает. :)
...
Рейтинг: 0 / 0
05.05.2016, 17:13
    #39230187
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с CREATE OR ALTER PROCEDURE (в 3.0) - где смотреть?
Симонов Денис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
05.05.2016, 17:19
    #39230198
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с CREATE OR ALTER PROCEDURE (в 3.0) - где смотреть?
Ivan_Pisarevskyиспользую wait транзакцию. Да, я понимаю, что "выдергиваю табуретку из-под задницы сидящего", но тем не менее работает. :)
Блин. У меня так тоже заработало.
Это мне не нравится
...
Рейтинг: 0 / 0
05.05.2016, 17:21
    #39230201
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с CREATE OR ALTER PROCEDURE (в 3.0) - где смотреть?
...
Рейтинг: 0 / 0
05.05.2016, 17:25
    #39230205
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с CREATE OR ALTER PROCEDURE (в 3.0) - где смотреть?
Симонов ДенисYuRock,
я имел ввиду http://www.firebirdsql.org/file/documentation/release_notes/html/rlsnotes255.html#rnfb25-apiods-api-unprpr
А, ясно. У меня делается DSQL_drop - этого должно быть достаточно.
Т.ч. это не должно влиять. Я ж говорю - стейтмента вообще нет.
...
Рейтинг: 0 / 0
05.05.2016, 17:27
    #39230207
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с CREATE OR ALTER PROCEDURE (в 3.0) - где смотреть?
YuRockIvan_Pisarevskyиспользую wait транзакцию. Да, я понимаю, что "выдергиваю табуретку из-под задницы сидящего", но тем не менее работает. :)
Блин. У меня так тоже заработало.
Это мне не нравится
Может кто объяснить, что происходит?
Как могут свойства транзакции wait/nowait влиять на object in use? Если транзакция, которая действительно его юзала, закоммитилась перед тем, как стартует новая?
Вообще это глюк или фича?
...
Рейтинг: 0 / 0
05.05.2016, 17:28
    #39230212
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с CREATE OR ALTER PROCEDURE (в 3.0) - где смотреть?
YuRock,

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

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

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

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

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

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

потому что в 3.0 в отличии от 2.x у SS нет общего кеша метаданных. Там только общий страничный кеш.
Когда он будет сделан хз. Обещаний сделать в 4.0 не было
...
Рейтинг: 0 / 0
05.05.2016, 18:55
    #39230285
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с CREATE OR ALTER PROCEDURE (в 3.0) - где смотреть?
Мда, вот еще такая история описана Дмитрием Емановым:
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
05.05.2016, 18:57
    #39230286
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с CREATE OR ALTER PROCEDURE (в 3.0) - где смотреть?
Симонов Денисв 3.0 в отличии от 2.x у SS нет общего кеша метаданных. Там только общий страничный кеш.
Да, я так уже и подумал.
...
Рейтинг: 0 / 0
05.05.2016, 19:04
    #39230290
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с CREATE OR ALTER PROCEDURE (в 3.0) - где смотреть?
В общем, я так понял, wait для alter procedure - это давняя "фича", которая что-то дополнительно делает, благодаря чему и работает.
...
Рейтинг: 0 / 0
05.05.2016, 19:29
    #39230306
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с CREATE OR ALTER PROCEDURE (в 3.0) - где смотреть?
Симонов ДенисYuRock,

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

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

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

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


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