|
Предотвратить рекурсию
|
|||
---|---|---|---|
#18+
Здравствуйте ВСЕ! Нужны идеи. У меня что-то не придумывается. Триггер: Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
понятное дело, что старт новой транзакции (IN AUTONOMOUS TRANSACTION DO) приводит к бесконечной рекурсии и исключению Too many concurrent executions of the same request. Есть у кого-нибудь мысли, как обойти? -- Регардсы и прочее. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2019, 14:58 |
|
Предотвратить рекурсию
|
|||
---|---|---|---|
#18+
Мимопроходящий, сравни current_transaction до и внутри области действия Код: sql 1.
Если меняется - повезло, тогда пиши значение в глобальную переменную и используй для отсечки рекурсии. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2019, 15:06 |
|
Предотвратить рекурсию
|
|||
---|---|---|---|
#18+
25.03.2019 15:06, ёёёёё пишет: > сравни current_transaction до и внутри области действия КАКИМ каком? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2019, 15:09 |
|
Предотвратить рекурсию
|
|||
---|---|---|---|
#18+
Мимопроходящий, в основной транзакции писать TRANSACTION_ID в какую-нибудь контекстную переменную USER_SESSION, которую затем проверять в триггере старта транзакции и если не совпадает - ничего не делать? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2019, 15:13 |
|
Предотвратить рекурсию
|
|||
---|---|---|---|
#18+
Мимопроходящий> 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.
не подходит, конкуренция большая? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2019, 15:14 |
|
Предотвратить рекурсию
|
|||
---|---|---|---|
#18+
25.03.2019 15:14, Гаджимурадов Рустам пишет: > не подходит, конкуренция большая? думал об этом. но у такой переменной область видимости глобальная для сессии. что не даёт гарантий отсутствия "пропусков" конкурентных транзакций в рамках этой же сессии. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2019, 15:17 |
|
Предотвратить рекурсию
|
|||
---|---|---|---|
#18+
Мимопроходящий, из описалова в доке не совсем понятно - для чего служит поле MON$TOP_TRANSACTION. Может это оно и есть - идентификатор транзакции, которая инициировала другую транзакцию? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2019, 15:40 |
|
Предотвратить рекурсию
|
|||
---|---|---|---|
#18+
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.03.2019, 15:58 |
|
Предотвратить рекурсию
|
|||
---|---|---|---|
#18+
rdb_dev, за использование MON$ в ON TRANSACTION START надо руки отрывать. Мимопроходящий, а точно надо в ON TRANSACTION START писать? Может подойдёт запись USER_TRANSACTION в ON TRANSACTION COMMIT и ON TRANSACTION ROLLBACK? Или поздно уже? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2019, 15:59 |
|
Предотвратить рекурсию
|
|||
---|---|---|---|
#18+
Мимопроходящий, автономная тр-ция тоже будет read only. Так что не с рекурсией тебе нужно бороться. Как вариант - RO тр-ция пишет в GTT ON COMMIT PRESERVE, RW тр-ция пишет в обычную таблицу - про себя и из GTT, очищая при этом GTT. Не думаю, что RW тр-ции в одном коннекте массово одновременно стартуют и будут драться. Но даже если попадёшь на lock conflict при удалении из GTT - не беда, следующая RW тр-ция сделает работу. Ну и - ON DISCONNECT тоже нужен в этой схеме. Проще - не логгировать старты RO тр-ций :) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2019, 15:59 |
|
Предотвратить рекурсию
|
|||
---|---|---|---|
#18+
25.03.2019 15:59, hvlad пишет: > автономная тр-ция тоже будет read only. эммм... без обид, но ты ВЫНИМАТЕЛЬНО прочитал стартовый пост? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2019, 16:03 |
|
Предотвратить рекурсию
|
|||
---|---|---|---|
#18+
Мимопроходящий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.03.2019, 16:03 |
|
Предотвратить рекурсию
|
|||
---|---|---|---|
#18+
Мимопроходящий25.03.2019 15:59, hvlad пишет: > автономная тр-ция тоже будет read only. эммм... без обид, но ты ВЫНИМАТЕЛЬНО прочитал стартовый пост?Похоже не вынимательно :) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2019, 16:06 |
|
Предотвратить рекурсию
|
|||
---|---|---|---|
#18+
Тогда можно на старте тр-ции писать в GTT ON COMMIT DELETE, без автономки. При коммите - переносить в постоянную таблицу, без автономки При роллбеке - переносить в постоянную таблицу, в автономке. Если там мало чего писать, то можно не в GTT, а в контекстную переменную уровня тр-ции (USER_TRANSACTION) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2019, 16:10 |
|
Предотвратить рекурсию
|
|||
---|---|---|---|
#18+
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.03.2019, 16:11 |
|
Предотвратить рекурсию
|
|||
---|---|---|---|
#18+
Мимопроходящийпытаюсь соорудить human-readable сообщение о лок-конфликте. что мол запись блокирует ВАСЯ ПУПКИН, а не транзакция № 2-12-85-06Пиши тогда это всё в другую БД ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2019, 16:18 |
|
Предотвратить рекурсию
|
|||
---|---|---|---|
#18+
25.03.2019 16:10, hvlad пишет: > Тогда можно на старте тр-ции писать в GTT ON COMMIT DELETE, без автономки. > При коммите - переносить в постоянную таблицу, без автономки > При роллбеке - переносить в постоянную таблицу, в автономке. не пойдёт. мне нужна глобальная видимость этой записи пока транзакция активна. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2019, 16:18 |
|
Предотвратить рекурсию
|
|||
---|---|---|---|
#18+
25.03.2019 16:18, hvlad пишет: > Пиши тогда это всё в другую БД склоняюсь к этому варианту. только не в другую, а в эту же (физически), под видом Код: sql 1. 2. 3. 4.
в этом случае рекурсию прервать можно по имени юзера. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2019, 16:24 |
|
Предотвратить рекурсию
|
|||
---|---|---|---|
#18+
Мимопроходящий, а не дороговато ли с точки зрения ресурсов? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2019, 16:29 |
|
Предотвратить рекурсию
|
|||
---|---|---|---|
#18+
Мимопроходящий> Пиши тогда это всё в другую БД склоняюсь к этому варианту.Это была полушутка... Но с fb4 это может стать нормальным вариантом - там есть пул внешних коннектов ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2019, 16:36 |
|
Предотвратить рекурсию
|
|||
---|---|---|---|
#18+
25.03.2019 16:29, Симонов Денис пишет: > а не дороговато ли с точки зрения ресурсов? щупать надо. пока не знаю. готов выслушать любые альтернативные идеи. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2019, 16:37 |
|
Предотвратить рекурсию
|
|||
---|---|---|---|
#18+
Мимопроходящийщупать надо. пока не знаю. готов выслушать любые альтернативные идеи.Вести таблицу активных транзакций с пользователями в memory mapped файле через UDF? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2019, 16:40 |
|
Предотвратить рекурсию
|
|||
---|---|---|---|
#18+
25.03.2019 16:40, rdb_dev пишет: > Вести таблицу активных транзакций с пользователями в memory mapped файле через UDF? идея хорошая, но мы от UDF отказались напрочь. по многим причинам. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2019, 16:49 |
|
Предотвратить рекурсию
|
|||
---|---|---|---|
#18+
rdb_dev, в Legacy UDF не надо!!! В UDR ещё можно сделать, но тоже не очень хорошо. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2019, 16:56 |
|
|
start [/forum/topic.php?fid=40&msg=39791019&tid=1560768]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
82ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
67ms |
get tp. blocked users: |
1ms |
others: | 300ms |
total: | 493ms |
0 / 0 |