目前項目中發現了這樣一個問題,在數據庫部署了RAC環境之后,偶爾會出現從Oracle Sequence所取出來的數是混亂的,比如第二次比第一次所取的數要小。這樣當程序的邏輯依賴於ID的大小來排序時,就會產生系統混亂。
其實問題是出在數據庫是個RAC環境,序列是被共享的,序列默認是有緩存的。假設RAC上的兩個節點上序列緩存設為20,第一個節點上緩存1-20,第二個節點緩存了21-40,當從不同節點來進行對sequence取值的時候,從第二個節點上取的值就會比從第一個節點上取的要大。而且默認序列都是noorder的。因為很有可能出現這種情況。
具體方法有兩個:
1. 設置cache為空
2. 創建序列的時候設置為order,即采用cache + order
Oracle下關於Sequence的使用有三種情況:
1. cache + noorder
2. nocache
3. cache + order
關於這三種情況具體的技術細節和性能比較,請參考下面的文章:
enq:SQ contention / row cache lock / DFS lock handle(SV) 等待事件 說明 http://blog.csdn.net/tianlesoftware/article/details/6534886
Oracle Sequence Cache 參數說明 http://blog.csdn.net/tianlesoftware/article/details/5995051