Добровольный приоритет транзакций в Oracle - PullRequest
2 голосов
/ 24 октября 2011

Я собираюсь сделать некоторые sql здесь. Я хочу что-то вроде следующего:

select ... for update priority 2; // Session 2

Итак, когда я запускаю в другой сессии

select ... for update priority 1; // Session 1

Он немедленно возвращается и выдает ошибку в сеансе 2 (и, следовательно, выполняет откат) и блокирует строку в сеансе 1.

Затем, пока сеанс 1 удерживает блокировку, в сеансе 2 выполняется следующее.

select ... for update priority 2; // Session 2

Дождется, пока сессия 1 снимет блокировку.

Как я мог реализовать такую ​​схему, поскольку priority x - это просто то, что я придумал. Мне нужно только то, что может сделать два уровня приоритета.

Кроме того, я рад скрыть всю свою логику в процедурах PL / SQL, мне не нужно это для работы с общими операторами SQL.

Я использую Oracle 10g, если это что-то меняет.

Ответы [ 2 ]

1 голос
/ 24 октября 2011

Мне неизвестен способ прерывания атомарного процесса в Oracle, как вы предлагаете. Я думаю, что единственное, что вы могли бы сделать, - это программно разбить ваши большие процессы на более мелкие и опросить какую-нибудь таблицу дозорного. Таким образом, вместо одного обновления для 1 миллиона строк, возможно, вы могли бы написать процедуру, которая обновит 1k, проверить таблицу заданий (или что-то подобное), чтобы увидеть, выполняется ли процесс с более высоким приоритетом и выполняется ли процесс с более высоким приоритетом, приостановить собственное выполнение через цикл ожидания. Это единственное, что я могу себе представить, чтобы поддержать ваш сеанс во время этого процесса.

Если вы действительно хотите прервать выполнение текущего запущенного потока с более низким приоритетом и потерять сеанс, то я бы предложил таблицу заданий снова, в которой зарегистрирован SQL, который запускался, и идентификатор сеанса, который он запускает. на. Если вы запустите оператор с более высоким приоритетом, он должен снова проверить таблицу заданий и затем выполнить команду kill для сеанса с низким приоритетом (http://www.oracle -base.com / article / misc / KillingOracleSessions.php) вместе со вставкой записи в задания Стол, чтобы отметить тот факт, что он был убит. Когда процесс с более высоким приоритетом завершается, он может проверить таблицу заданий, чтобы узнать, не несет ли он ответственность за уничтожение чего-либо, и, если это так, переиздать его.

0 голосов
/ 24 октября 2011

Для этого был реализован менеджер ресурсов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...