我有一个bpel进程,它通过java调用db2存储过程来获取唯一的序列号,然后将该数字插入到db2表之一中。此过程在群集环境中运行,因此有时会发生两个进程实例获得相同的唯一序列号,然后尝试将重复值插入到表中导致错误。感谢。
答案 0 :(得分:0)
正如@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);
此问题的解决方案是:
alter sequence
重新启动序列,以免产生冲突。 (在上面的示例中,执行淘气插入语句后alter sequence s1 restart with 14
。答案 1 :(得分:0)
正如你所说,Bpel正在集群环境中运行..
如果您使用的是Bpel Polling,请确保标记为“Distributed Polling”标志。
分布式轮询意味着在读取记录时,它会被读取实例锁定。另一个想要获取记录的实例会跳过锁定的记录。