Hello, All!

Где то проскакивала подобная задача раньше, но что-то не могу найти.

Есть несколько независимо работающих роботов, которые порциями
обрабатывают записи из очереди/таблицы.

Как кто прячет взятые на обработку записи от других роботов?

Пока пришел к не очень красивому решению, когда при получении порции
очереди записи просто лочатся апдейтом - но скорость решения будет не
велика, как я понимаю, из-за накладных расходов на when any do.

CREATE PROCEDURE QUERY_SEL(row_count integer) RETURNS (ID_row INTEGER)
AS
begin
  for select first(:row_count) sq.id_row,
      from query sq
      where sq.id_send_state=1
      into :id_row  do
  begin

    update sgtquery sq set sq.id_send_state=2, sq.lock_time=current_timestamp 
where sq.id_row=:id_row;
    suspend;

    when any do
    begin
      row_count = row_count +1;
    end

  end
end

да, еще вопрос - почему не срабатывает
row_count = row_count +1; - ведь фетчим вроде по одной записи?
Проверка с генератором показывает, что обращений после начала
выполнения запроса к row_count нет - что кажется странным.

--
-=Один хороший вопрос, может всю лекцию завалить.=-
With best regards,  Nikolay Ponomarenko


Ответить