问题说明
在多实例环境中可能会出现从Sequence所取出来的nextval是乱序的,比如第二次比第一次所取的数要小但这并不是我们所希望的。当程序逻辑Base on sequence.nextval数值所谓填充字段的大小来排序时,就会产生问题。
实际上就是由于多实例这一特性造成的,因为实例是内存和进程的集合,单个实例的内存资源存在相对独立的场景,sequence默认会开启cache并且noorder。假设RAC上的两个节点上序列缓存设为20,第一个节点上缓存100-120,第二个节点缓存了121-140,而RAC环境对外提供的是scan ip所以当连接到不同节点就会出现取值乱序的情况。
解决方式
取消缓存或者添加order,当然也可以nocache+order
drop sequence user.seq1;
create sequence user.seq1
minvalue 1
maxvalue 9999999999999999999999999999
start with 66666
increment by 1
nocache --不开启缓存
order; --按序