У меня есть процесс bpel, который вызывает хранимую процедуру db2 через java для получения уникального порядкового номера, а затем вставляет этот номер в одну из таблиц db2. Этот процесс выполняется в кластерной среде, поэтому иногда бывает так, что два экземпляра процесса получают один и тот же уникальный порядковый номер, а затем пытаются вставить повторяющиеся значения в таблицу, что приводит к ошибке. Спасибо.
Проблема дублирования службы bpel в кластерной среде
Ответы (2)
Как говорит @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 невозможен, убедитесь, что вы используете
alter sequence
для перезапуска последовательности, чтобы не вызвать конфликт. (в приведенном выше примереalter sequence s1 restart with 14
после выполнения непослушного оператора вставки.
Как вы сказали, Bpel работает в кластерной среде.
Если вы используете опрос Bpel, убедитесь, что вы отметили флаг «Распределенный опрос».
Распределенный опрос означает, что когда запись читается, она блокируется экземпляром чтения. Другой экземпляр, который хочет получить запись, пропускает заблокированные записи.
sequence
введите DB2, что гарантирует отсутствие дубликатов. - person bhamby   schedule 10.02.2014