Проблема с дублированием службы bpel в кластерной среде

У меня есть процесс bpel, который вызывает хранимую процедуру db2 через Java, чтобы получить уникальный порядковый номер, а затем вставить этот номер в одну из таблиц db2. Этот процесс выполняется в кластерной среде, поэтому иногда бывает, что два экземпляра процесса получают один и тот же уникальный порядковый номер, а затем пытается вставить повторяющиеся значения в таблицу, что приводит к ошибке. Благодарю.

2 ответа

Как вы сказали, Bpel работает на кластерном окружении..

Если вы используете Bpel Polling, убедитесь, что вы отметили флаг "Распределенный опрос".

Распределенный опрос означает, что когда запись читается, она блокируется экземпляром чтения. Другой экземпляр, который хочет забрать запись, пропускает заблокированные записи.

Как говорит @mustaccio, если вы используете последовательность, невозможно получить одно и то же значение дважды, независимо от того, сколько клиентов запрашивают значения из последовательности одновременно.

Тем не менее, ничто не мешает вам вставить строку в таблицу со значением, которое последовательность еще не сгенерировала; Затем, когда последовательность вернет значение, о котором идет речь, и вы попытаетесь вставить его, произойдет сбой:

create table test (id int not null primary key);
create sequence s1 start with 10;

-- This will insert the value 10, which is OK.
insert into test values (nextval for s1);

-- This will insert the value 11, which is OK.
insert into test values (nextval for s1);

-- Insert a row without using sequence  (BAD!)
insert into test values (13);

-- This will insert the value 12, which is OK.
insert into test values (nextval for s1);

-- This will attempt to the value 13, which will fail because it is a "duplicate", 
-- but not because the sequence generated a duplicate.
insert into test values (nextval for s1); 

Решением этой проблемы является:

  1. Убедитесь, что процессы не вставляют значения без использования последовательности
  2. Если № 1 не представляется возможным, убедитесь, что вы используете alter sequence перезапустить последовательность так, чтобы это не вызвало конфликт. (в приведенном выше примере alter sequence s1 restart with 14 после выполнения непослушного заявления вставки.
Другие вопросы по тегам