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

时间:2014-02-10 16:51:04

标签: db2 bpel oracle-fusion-middleware

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

2 个答案:

答案 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); 

此问题的解决方案是:

  1. 确保进程不使用序列
  2. 插入值
  3. 如果无法#1,请确保使用alter sequence重新启动序列,以免产生冲突。 (在上面的示例中,执行淘气插入语句后alter sequence s1 restart with 14

答案 1 :(得分:0)

正如你所说,Bpel正在集群环境中运行..

如果您使用的是Bpel Polling,请确保标记为“Distributed Polling”标志。

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