我有一个 bpel 进程,它通过 java 调用一个 db2 存储过程来获取一个唯一的序列号,然后将该编号插入到一个 db2 表中。该进程在集群环境中运行,因此有时会发生进程的两个实例获得相同的唯一序列号,然后尝试将重复值插入表中导致故障。谢谢。
问问题
578 次
2 回答
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 不可能,请确保您使用
alter sequence
重新启动序列,这样它就不会产生冲突。(在上面的示例中,alter sequence s1 restart with 14
在执行了顽皮的插入语句之后。
于 2014-02-11T00:29:35.980 回答
0
正如你所说,Bpel 在集群环境中运行。
如果您使用 Bpel 轮询,请确保您标记了“分布式轮询”标志。
分布式轮询意味着当一条记录被读取时,它被读取实例锁定。另一个想要获取记录的实例会跳过锁定的记录。
于 2015-06-19T12:35:15.000 回答