Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Предотвратить рекурсию / 25 сообщений из 62, страница 1 из 3
25.03.2019, 14:58
    #39790984
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предотвратить рекурсию
Здравствуйте ВСЕ!

Нужны идеи.
У меня что-то не придумывается.

Триггер:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE TRIGGER TRANSACTION_START
ACTIVE ON TRANSACTION START
AS
BEGIN
  IF (RDB$GET_CONTEXT ('SYSTEM', 'READ_ONLY') = 'FALSE') THEN
    IN AUTONOMOUS TRANSACTION DO
      INSERT INTO USER_TRANSACTION (USER_NAME, TRANSACTION_ID) VALUES (CURRENT_USER, CURRENT_TRANSACTION);
END;


понятное дело, что старт новой транзакции (IN AUTONOMOUS TRANSACTION DO)
приводит к бесконечной рекурсии и исключению Too many concurrent executions of the same request.

Есть у кого-нибудь мысли, как обойти?

--
Регардсы и прочее.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25.03.2019, 15:06
    #39790985
ёёёёё
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предотвратить рекурсию
Мимопроходящий,

сравни current_transaction до и внутри области действия
Код: sql
1.
IN AUTONOMOUS TRANSACTION DO.



Если меняется - повезло, тогда пиши значение в глобальную переменную и используй для отсечки рекурсии.
...
Рейтинг: 0 / 0
25.03.2019, 15:09
    #39790987
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предотвратить рекурсию
25.03.2019 15:06, ёёёёё пишет:
> сравни current_transaction до и внутри области действия

КАКИМ каком?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25.03.2019, 15:13
    #39790989
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предотвратить рекурсию
Мимопроходящий, в основной транзакции писать TRANSACTION_ID в какую-нибудь контекстную переменную USER_SESSION, которую затем проверять в триггере старта транзакции и если не совпадает - ничего не делать?
...
Рейтинг: 0 / 0
25.03.2019, 15:14
    #39790990
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предотвратить рекурсию
Мимопроходящий> IF (RDB$GET_CONTEXT ('SYSTEM', 'READ_ONLY') = 'FALSE') THEN
Мимопроходящий> IN AUTONOMOUS TRANSACTION DO
Мимопроходящий> INSERT INTO USER_TRANSACTION

Стандартное
Код: sql
1.
2.
3.
4.
5.
6.
7.
IF (RDB$GET_CONTEXT (Session, 'SOMEVAR') = 'FALSE') THEN
begin
RDB$SET_CONTEXT (Session, 'SOMEVAR', 'True');
IN AUTONOMOUS TRANSACTION DO
INSERT INTO USER_TRANSACTION
RDB$SET_CONTEXT (Session, 'SOMEVAR', 'False');
end


не подходит, конкуренция большая?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25.03.2019, 15:17
    #39790993
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предотвратить рекурсию
25.03.2019 15:14, Гаджимурадов Рустам пишет:
> не подходит, конкуренция большая?

думал об этом.
но у такой переменной область видимости глобальная для сессии.
что не даёт гарантий отсутствия "пропусков" конкурентных транзакций
в рамках этой же сессии.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25.03.2019, 15:40
    #39791009
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предотвратить рекурсию
Мимопроходящий, из описалова в доке не совсем понятно - для чего служит поле MON$TOP_TRANSACTION. Может это оно и есть - идентификатор транзакции, которая инициировала другую транзакцию?
...
Рейтинг: 0 / 0
25.03.2019, 15:58
    #39791017
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предотвратить рекурсию
25.03.2019 15:40, rdb_dev пишет:
> Мимопроходящий, из описалова в доке не совсем понятно - для чего служит поле MON$TOP_TRANSACTION.
> Может это оно и есть - идентификатор транзакции, которая инициировала другую транзакцию?

MON$TOP_TRANSACTION is the upper limit used by the sweeper transaction when advancing the global OIT.
All transactions above this threshold are considered active.
It is normally equivalent to the MON$TRANSACTION_ID but COMMIT RETAINING or ROLLBACK RETAINING
will cause MON $TOP_TRANSACTION to remain unchanged (“stuck”) when the transaction ID is incremented.

это было в релизных нотах к 2.1

зы: Денис, надо бы в доку внести, а то действительно, нихрена ж не понятно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25.03.2019, 15:59
    #39791018
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предотвратить рекурсию
rdb_dev,

за использование MON$ в ON TRANSACTION START надо руки отрывать.

Мимопроходящий,

а точно надо в ON TRANSACTION START писать? Может подойдёт запись USER_TRANSACTION в ON TRANSACTION COMMIT и ON TRANSACTION ROLLBACK? Или поздно уже?
...
Рейтинг: 0 / 0
25.03.2019, 15:59
    #39791019
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предотвратить рекурсию
Мимопроходящий,

автономная тр-ция тоже будет read only.
Так что не с рекурсией тебе нужно бороться.

Как вариант - RO тр-ция пишет в GTT ON COMMIT PRESERVE, RW тр-ция пишет в обычную таблицу - про себя и из GTT, очищая при этом GTT.
Не думаю, что RW тр-ции в одном коннекте массово одновременно стартуют и будут драться.
Но даже если попадёшь на lock conflict при удалении из GTT - не беда, следующая RW тр-ция сделает работу.
Ну и - ON DISCONNECT тоже нужен в этой схеме.

Проще - не логгировать старты RO тр-ций :)
...
Рейтинг: 0 / 0
25.03.2019, 16:03
    #39791023
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предотвратить рекурсию
25.03.2019 15:59, hvlad пишет:
> автономная тр-ция тоже будет read only.

эммм...
без обид, но ты ВЫНИМАТЕЛЬНО прочитал стартовый пост?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25.03.2019, 16:03
    #39791024
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предотвратить рекурсию
Мимопроходящий25.03.2019 15:40, rdb_dev пишет:
> Мимопроходящий, из описалова в доке не совсем понятно - для чего служит поле MON$TOP_TRANSACTION.
> Может это оно и есть - идентификатор транзакции, которая инициировала другую транзакцию?

MON$TOP_TRANSACTION is the upper limit used by the sweeper transaction when advancing the global OIT.
All transactions above this threshold are considered active.
It is normally equivalent to the MON$TRANSACTION_ID but COMMIT RETAINING or ROLLBACK RETAINING
will cause MON $TOP_TRANSACTION to remain unchanged (“stuck”) when the transaction ID is incremented.

это было в релизных нотах к 2.1

зы: Денис, надо бы в доку внести, а то действительно, нихрена ж не понятно.


добавлю
...
Рейтинг: 0 / 0
25.03.2019, 16:06
    #39791027
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предотвратить рекурсию
Мимопроходящий25.03.2019 15:59, hvlad пишет:
> автономная тр-ция тоже будет read only.

эммм...
без обид, но ты ВЫНИМАТЕЛЬНО прочитал стартовый пост?Похоже не вынимательно :)
...
Рейтинг: 0 / 0
25.03.2019, 16:10
    #39791029
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предотвратить рекурсию
Тогда можно на старте тр-ции писать в GTT ON COMMIT DELETE, без автономки.
При коммите - переносить в постоянную таблицу, без автономки
При роллбеке - переносить в постоянную таблицу, в автономке.

Если там мало чего писать, то можно не в GTT, а в контекстную переменную уровня тр-ции (USER_TRANSACTION)
...
Рейтинг: 0 / 0
25.03.2019, 16:11
    #39791030
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предотвратить рекурсию
25.03.2019 15:59, Симонов Денис пишет:
> а точно надо в ON TRANSACTION START писать? Может подойдёт запись USER_TRANSACTION в ON TRANSACTION COMMIT и ON TRANSACTION ROLLBACK? Или поздно уже?

поздно.
пытаюсь соорудить human-readable сообщение о лок-конфликте.
что мол запись блокирует ВАСЯ ПУПКИН, а не транзакция № 2-12-85-06
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25.03.2019, 16:18
    #39791035
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предотвратить рекурсию
Мимопроходящийпытаюсь соорудить human-readable сообщение о лок-конфликте.
что мол запись блокирует ВАСЯ ПУПКИН, а не транзакция № 2-12-85-06Пиши тогда это всё в другую БД
...
Рейтинг: 0 / 0
25.03.2019, 16:18
    #39791036
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предотвратить рекурсию
25.03.2019 16:10, hvlad пишет:
> Тогда можно на старте тр-ции писать в GTT ON COMMIT DELETE, без автономки.
> При коммите - переносить в постоянную таблицу, без автономки
> При роллбеке - переносить в постоянную таблицу, в автономке.

не пойдёт.
мне нужна глобальная видимость этой записи пока транзакция активна.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25.03.2019, 16:24
    #39791039
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предотвратить рекурсию
25.03.2019 16:18, hvlad пишет:
> Пиши тогда это всё в другую БД

склоняюсь к этому варианту.
только не в другую, а в эту же (физически), под видом
Код: sql
1.
2.
3.
4.
EXECUTE STATEMENT ...
WITH AUTONOMOUS TRANSACTION
AS USER "специальный" PASSWORD '12345'
ON EXTERNAL DATA SOURCE ...


в этом случае рекурсию прервать можно по имени юзера.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25.03.2019, 16:29
    #39791043
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предотвратить рекурсию
Мимопроходящий,

а не дороговато ли с точки зрения ресурсов?
...
Рейтинг: 0 / 0
25.03.2019, 16:36
    #39791047
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предотвратить рекурсию
Мимопроходящий> Пиши тогда это всё в другую БД

склоняюсь к этому варианту.Это была полушутка...

Но с fb4 это может стать нормальным вариантом - там есть пул внешних коннектов
...
Рейтинг: 0 / 0
25.03.2019, 16:37
    #39791049
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предотвратить рекурсию
25.03.2019 16:29, Симонов Денис пишет:
> а не дороговато ли с точки зрения ресурсов?

щупать надо. пока не знаю.
готов выслушать любые альтернативные идеи.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25.03.2019, 16:40
    #39791051
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предотвратить рекурсию
Мимопроходящийщупать надо. пока не знаю.
готов выслушать любые альтернативные идеи.Вести таблицу активных транзакций с пользователями в memory mapped файле через UDF?
...
Рейтинг: 0 / 0
25.03.2019, 16:49
    #39791057
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предотвратить рекурсию
25.03.2019 16:40, rdb_dev пишет:
> Вести таблицу активных транзакций с пользователями в memory mapped файле через UDF?

идея хорошая, но мы от UDF отказались напрочь.
по многим причинам.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25.03.2019, 16:56
    #39791060
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предотвратить рекурсию
rdb_dev,

в Legacy UDF не надо!!! В UDR ещё можно сделать, но тоже не очень хорошо.
...
Рейтинг: 0 / 0
25.03.2019, 16:57
    #39791061
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Предотвратить рекурсию
Симонов Денис> а не дороговато ли с точки зрения ресурсов?

До ресурсов есть еще вопрос безопасности.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Предотвратить рекурсию / 25 сообщений из 62, страница 1 из 3
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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