Пакетный запуск на нескольких серверах - PullRequest
0 голосов
/ 14 июня 2011

У меня есть пакетное приложение, которое просто состоит из этих шагов.

  • Выберите все записи из таблицы, в которой столбец флага обновления имеет значение null
  • Обработка выбранной информации
  • Пометить запись как обновленную

Я использую Oracle 10g, и я пытаюсь выполнить это приложение на нескольких серверах одновременно.Однако меня беспокоит механизм блокировки Oracle.Когда первый экземпляр моего приложения, работающего на первом сервере, выбирает запись, другой экземпляр, работающий на втором сервере , не должен быть в состоянии выбрать ее.

Подходит ли для использования "выбрать для обновления "для такого рода целей?Если я использую шаблон «выбрать для обновления, пропустить заблокированный», второй экземпляр приложения автоматически пропускает те записи, заблокированные первым, и выбирает эти другие строки?Или он ожидает освобождения заблокированных строк?

Буду признателен за любые советы и предложения

Ответы [ 2 ]

0 голосов
/ 14 июня 2011

Я использую select for update skip locked, и он отлично работает. Да, более поздние сеансы молча пропускают записи, заблокированные предыдущими сеансами, и выбирают / блокируют другие строки. Убедитесь, что нет других общих данных, измененных параллельными сеансами обработки, или вы застряли в другом узком месте.

declare 
  my_limit constant number default 1000;
  cursor cRecords is
    select primary_key
    from processed_table t
    where t.update_flag is null
    for update skip locked;
  type t_cRecords is table of cRecords%rowtype;
  tRecords t_cRecords;
begin
  open cRecords;
  while true loop
    -- Select all the records from the table where the update-flag column is null
    fetch cRecords bulk collect into tRecords limit my_limit;
    -- Process the selected information
    -- ...
    -- Mark the record as updated
    forall i in tRecords.first..tRecords.last
      update processed_table
        set update_flag = 'PROCESSED'
      where primary_key = tRecords(i).primary_key;
    --
    exit when tRecords.count < my_limit;
  end loop;
end;

Кстати, я не подтверждаю Параллелизм в пропущенном заблокированном сценарии - на моем сайте ускоряется от 4 до одной секунды, используя скрипты от rwijk.

0 голосов
/ 14 июня 2011

Мой коллега Роб написал хорошую статью об этом Параллелизм в пропущенном заблокированном сценарии Так что да, это работает, нет, это не поможет вам. FWIW: может быть разумнее немного изменить алгоритм, присвоить флагу обновления значение, инкрементное число, чтобы помочь процессам выбора, которые обрабатывают новые данные, и обновить до NULL, когда будет готов. Преимущество здесь в два раза

  1. уменьшает размер индекса
  2. это облегчает реализацию парализма, потому что теперь все процессы могут выбирать «свои» строки.

Надеюсь, это поможет.

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