powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Не работает resource_constraint при параллельном запуске джобов
2 сообщений из 2, страница 1 из 1
Не работает resource_constraint при параллельном запуске джобов
    #40012974
12qwQW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пытаюсь решить такую задачу:
Есть процедура, которая должна выполняться в монопольном режиме (т.е. одновременно в базе должно выполняться не более 1 "запуска" этой процедуры). Процедура должна выполняться при каждом наступлении некоторого события (1 событие = 1 запуск процедуры). Если 2 события произошли почти одновременно, то процедура выполняется 2 раза, причем второй запуск выполняется сразу после завершения первого.
Что делаю:
Создал очередь для событий (dbms_aqadm.create_queue), расписание на основе этой очереди (dbms_scheduler.create_event_schedule), программу (DBMS_SCHEDULER.create_program) и джоб (DBMS_SCHEDULER.CREATE_JOB).
Записал в очередь 3 сообщения подряд. При этом джоб выполнился только 1 раз.
Нашел, что это поведение по умолчанию, чтобы его переопределить, нужно установить значение атрибута:
Код: plsql
1.
DBMS_SCHEDULER.SET_ATTRIBUTE ('XX_TEST_JOB', 'PARALLEL_INSTANCES', TRUE);


С этим атрибутом джоб стал запускаться 3 раза, но не последовательно, а почти одновременно.
Пробовал изменить это поведение с помощью создания resource_constraint:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
BEGIN
  DBMS_SCHEDULER.create_resource (
    resource_name    => 'XX_TEST_RESOURCE',
    units            => 1,
    status           => 'ENFORCE_CONSTRAINTS',
    constraint_level => 'JOB_LEVEL',
    comments         => 'XX Test Resource'
  );
  DBMS_SCHEDULER.set_resource_constraint (
    object_name      => 'XX_TEST_JOB',
    resource_name    => 'XX_TEST_RESOURCE',
    units            => 1
  );
END;


Это не помогло, джобы всё равно запускаются одновременно.
Нашел на эту тему такую ноту на металинке: Oracle Support Document 2272234.1 (12cR2 DBMS_SCHEDULER Resource_Queues Not Working)
Но в ней говорится о несрабатывании resource_constraint при ручном запуске джобов (DBMS_SCHEDULER.run_JOB). Это, как выяснилось, норма (хотя нигде и не указано):
авторCAUSE
A manual run won't enforce the constraint defined for the job.
SOLUTION
Schedule the jobs to run at the same time to get the Resource Constraints enabled.
Но у меня-то именно запуск по расписанию, по идее должно работать. Или расписание на основе событий не считается за расписание?
В общем, вопросов много, а идеи закончились...

Знаю, что исходную задачу можно решить с помощью dbms_lock в самой процедуре. Но хотелось бы все-таки сделать средствами самого dbms_scheduler, раз уж такая возможность заявлена.

Буду признателен за советы!

Версия базы: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
...
Рейтинг: 0 / 0
Не работает resource_constraint при параллельном запуске джобов
    #40013022
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очереди можно приладить обработчик (callback).
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Не работает resource_constraint при параллельном запуске джобов
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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