問題說明
在多實例環境中可能會出現從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; --按序