Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Firebird, InterBase Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Предотвратить рекурсию  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 29780

Здравствуйте ВСЕ!

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

Триггер:
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

25 мар 19, 14:58    [21842856]     Ответить | Цитировать Сообщить модератору
 Re: Предотвратить рекурсию  [new]
ёёёёё
Member

Откуда:
Сообщений: 85
Мимопроходящий,

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


Если меняется - повезло, тогда пиши значение в глобальную переменную и используй для отсечки рекурсии.
25 мар 19, 15:06    [21842864]     Ответить | Цитировать Сообщить модератору
 Re: Предотвратить рекурсию  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 29780

25.03.2019 15:06, ёёёёё пишет:
> сравни current_transaction до и внутри области действия

КАКИМ каком?

Posted via ActualForum NNTP Server 1.5

25 мар 19, 15:09    [21842868]     Ответить | Цитировать Сообщить модератору
 Re: Предотвратить рекурсию  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 2628
Мимопроходящий, в основной транзакции писать TRANSACTION_ID в какую-нибудь контекстную переменную USER_SESSION, которую затем проверять в триггере старта транзакции и если не совпадает - ничего не делать?
25 мар 19, 15:13    [21842870]     Ответить | Цитировать Сообщить модератору
 Re: Предотвратить рекурсию  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 59685
Мимопроходящий> IF (RDB$GET_CONTEXT ('SYSTEM', 'READ_ONLY') = 'FALSE') THEN
Мимопроходящий> IN AUTONOMOUS TRANSACTION DO
Мимопроходящий> INSERT INTO USER_TRANSACTION

Стандартное
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

25 мар 19, 15:14    [21842871]     Ответить | Цитировать Сообщить модератору
 Re: Предотвратить рекурсию  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 29780

25.03.2019 15:14, Гаджимурадов Рустам пишет:
> не подходит, конкуренция большая?

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

Posted via ActualForum NNTP Server 1.5

25 мар 19, 15:17    [21842876]     Ответить | Цитировать Сообщить модератору
 Re: Предотвратить рекурсию  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 2628
Мимопроходящий, из описалова в доке не совсем понятно - для чего служит поле MON$TOP_TRANSACTION. Может это оно и есть - идентификатор транзакции, которая инициировала другую транзакцию?
25 мар 19, 15:40    [21842907]     Ответить | Цитировать Сообщить модератору
 Re: Предотвратить рекурсию  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 29780

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

25 мар 19, 15:58    [21842921]     Ответить | Цитировать Сообщить модератору
 Re: Предотвратить рекурсию  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 9388
rdb_dev,

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

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

а точно надо в ON TRANSACTION START писать? Может подойдёт запись USER_TRANSACTION в ON TRANSACTION COMMIT и ON TRANSACTION ROLLBACK? Или поздно уже?
25 мар 19, 15:59    [21842922]     Ответить | Цитировать Сообщить модератору
 Re: Предотвратить рекурсию  [new]
hvlad
Member

Откуда:
Сообщений: 10241
Мимопроходящий,

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

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

Проще - не логгировать старты RO тр-ций :)
25 мар 19, 15:59    [21842923]     Ответить | Цитировать Сообщить модератору
 Re: Предотвратить рекурсию  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 29780

25.03.2019 15:59, hvlad пишет:
> автономная тр-ция тоже будет read only.

эммм...
без обид, но ты ВЫНИМАТЕЛЬНО прочитал стартовый пост?

Posted via ActualForum NNTP Server 1.5

25 мар 19, 16:03    [21842929]     Ответить | Цитировать Сообщить модератору
 Re: Предотвратить рекурсию  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 9388
Мимопроходящий
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

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


добавлю
25 мар 19, 16:03    [21842930]     Ответить | Цитировать Сообщить модератору
 Re: Предотвратить рекурсию  [new]
hvlad
Member

Откуда:
Сообщений: 10241
Мимопроходящий
25.03.2019 15:59, hvlad пишет:
> автономная тр-ция тоже будет read only.

эммм...
без обид, но ты ВЫНИМАТЕЛЬНО прочитал стартовый пост?
Похоже не вынимательно :)
25 мар 19, 16:06    [21842934]     Ответить | Цитировать Сообщить модератору
 Re: Предотвратить рекурсию  [new]
hvlad
Member

Откуда:
Сообщений: 10241
Тогда можно на старте тр-ции писать в GTT ON COMMIT DELETE, без автономки.
При коммите - переносить в постоянную таблицу, без автономки
При роллбеке - переносить в постоянную таблицу, в автономке.

Если там мало чего писать, то можно не в GTT, а в контекстную переменную уровня тр-ции (USER_TRANSACTION)
25 мар 19, 16:10    [21842936]     Ответить | Цитировать Сообщить модератору
 Re: Предотвратить рекурсию  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 29780

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

25 мар 19, 16:11    [21842937]     Ответить | Цитировать Сообщить модератору
 Re: Предотвратить рекурсию  [new]
hvlad
Member

Откуда:
Сообщений: 10241
Мимопроходящий
пытаюсь соорудить human-readable сообщение о лок-конфликте.
что мол запись блокирует ВАСЯ ПУПКИН, а не транзакция № 2-12-85-06
Пиши тогда это всё в другую БД
25 мар 19, 16:18    [21842947]     Ответить | Цитировать Сообщить модератору
 Re: Предотвратить рекурсию  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 29780

25.03.2019 16:10, hvlad пишет:
> Тогда можно на старте тр-ции писать в GTT ON COMMIT DELETE, без автономки.
> При коммите - переносить в постоянную таблицу, без автономки
> При роллбеке - переносить в постоянную таблицу, в автономке.

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

Posted via ActualForum NNTP Server 1.5

25 мар 19, 16:18    [21842949]     Ответить | Цитировать Сообщить модератору
 Re: Предотвратить рекурсию  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 29780

25.03.2019 16:18, hvlad пишет:
> Пиши тогда это всё в другую БД

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

в этом случае рекурсию прервать можно по имени юзера.

Posted via ActualForum NNTP Server 1.5

25 мар 19, 16:24    [21842954]     Ответить | Цитировать Сообщить модератору
 Re: Предотвратить рекурсию  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 9388
Мимопроходящий,

а не дороговато ли с точки зрения ресурсов?
25 мар 19, 16:29    [21842959]     Ответить | Цитировать Сообщить модератору
 Re: Предотвратить рекурсию  [new]
hvlad
Member

Откуда:
Сообщений: 10241
Мимопроходящий
> Пиши тогда это всё в другую БД

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

Но с fb4 это может стать нормальным вариантом - там есть пул внешних коннектов
25 мар 19, 16:36    [21842966]     Ответить | Цитировать Сообщить модератору
 Re: Предотвратить рекурсию  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 29780

25.03.2019 16:29, Симонов Денис пишет:
> а не дороговато ли с точки зрения ресурсов?

щупать надо. пока не знаю.
готов выслушать любые альтернативные идеи.

Posted via ActualForum NNTP Server 1.5

25 мар 19, 16:37    [21842968]     Ответить | Цитировать Сообщить модератору
 Re: Предотвратить рекурсию  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 2628
Мимопроходящий
щупать надо. пока не знаю.
готов выслушать любые альтернативные идеи.
Вести таблицу активных транзакций с пользователями в memory mapped файле через UDF?
25 мар 19, 16:40    [21842970]     Ответить | Цитировать Сообщить модератору
 Re: Предотвратить рекурсию  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 29780

25.03.2019 16:40, rdb_dev пишет:
> Вести таблицу активных транзакций с пользователями в memory mapped файле через UDF?

идея хорошая, но мы от UDF отказались напрочь.
по многим причинам.

Posted via ActualForum NNTP Server 1.5

25 мар 19, 16:49    [21842976]     Ответить | Цитировать Сообщить модератору
 Re: Предотвратить рекурсию  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 9388
rdb_dev,

в Legacy UDF не надо!!! В UDR ещё можно сделать, но тоже не очень хорошо.
25 мар 19, 16:56    [21842979]     Ответить | Цитировать Сообщить модератору
 Re: Предотвратить рекурсию  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 59685
Симонов Денис> а не дороговато ли с точки зрения ресурсов?

До ресурсов есть еще вопрос безопасности.

Posted via ActualForum NNTP Server 1.5

25 мар 19, 16:57    [21842981]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Firebird, InterBase Ответить