Db2 集群环境中bpel服务的重复问题

Db2 集群环境中bpel服务的重复问题,db2,bpel,oracle-fusion-middleware,Db2,Bpel,Oracle Fusion Middleware,我有一个bpel流程,它通过java调用一个db2存储过程来获取一个唯一的序列号,然后将该序列号插入一个db2表中。此进程在集群环境中运行,因此有时会发生两个进程实例获得相同的唯一序列号,然后它尝试向表中插入重复值,从而导致错误。谢谢。正如@mustaccio所说,如果使用序列,则不可能两次获得相同的值,无论有多少客户端同时从序列中请求值 也就是说,没有什么可以阻止您将一行插入到一个表中,该表中的值是序列尚未生成的;然后,当序列返回有问题的值并尝试插入时,它将失败: create table t

我有一个bpel流程,它通过java调用一个db2存储过程来获取一个唯一的序列号,然后将该序列号插入一个db2表中。此进程在集群环境中运行,因此有时会发生两个进程实例获得相同的唯一序列号,然后它尝试向表中插入重复值,从而导致错误。谢谢。

正如@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重新启动序列,以使其不会产生冲突。在上面的示例中,执行顽皮的insert语句后,alter sequence s1用14重新启动。
正如您所说,Bpel正在集群环境上运行

如果您使用的是Bpel轮询,请确保您标记了“分布式轮询”标志


分布式轮询意味着当读取记录时,它被读取实例锁定。另一个要拾取记录的实例跳过锁定的记录。

显然,应该生成唯一序列号的存储过程不会。您需要重写该过程,或者,如果不可能,可以在Java程序中同步对该过程的调用,以便两个进程不能同时调用该过程。另一个选项是使用DB2中的内置类型,该类型保证不会重复。感谢您提供的信息。存储过程在DB2中使用序列类型。另外,由于集群环境,通过Java进行同步调用将无法解决问题,因为我们有两个服务器,代码在其中,Java对db2序列的调用将同时从这两个服务器进行,从而产生重复。