RAC環境下的SEQUENCE對應用的影響

zhang41082發表於2019-01-26
生產系統上了RAC,幾天後接到同事報告,說一個取sequence的地方資料有問題,按資料插入時間來判斷先取的sequence值大,而後取的反而小,與之前對sequence的理解有出入。測試如下[@more@]

在節點一上:

Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - 64bit Production
With the Partitioning, Real Application Clusters and Data Mining options

SQL> create sequence seq_t
2 minvalue 1
3 maxvalue 999999
4 start with 1
5 increment by 1;

Sequence created.

SQL> select seq_t.nextval from dual;

NEXTVAL
----------
1

在節點二上

Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - 64bit Production
With the Partitioning, Real Application Clusters and Data Mining options

SQL> select seq_t.nextval from dual;

NEXTVAL
----------
21

因為建立sequence的時候沒有設定cache選項,所以系統預設cache為20,因此先在節點一上cache了20個,然後節點二上cache了20-40。因此當從不同的節點來進行對sequence取值的時候,會造成先取的值不一定是小的,同樣後取的值不一定會大。

接著在節點一上做如下操作:

SQL> drop sequence seq_t;

Sequence dropped.

SQL> create sequence seq_t
2 minvalue 1
3 maxvalue 999999
4 start with 1
5 increment by 1
6 nocache;

Sequence created.

SQL> select seq_t.nextval from dual;

NEXTVAL
----------
1

在節點二上:

SQL> select seq_t.nextval from dual;

NEXTVAL
----------
2

SQL> select seq_t.nextval from dual;

NEXTVAL
----------
3

SQL>

再返回節點一:

SQL> select seq_t.nextval from dual;

NEXTVAL
----------
4

SQL>

可以看到把sequence的cache取消後,保證了先取的值小,後取的值大。

結論:RAC對前臺程式來說是完全透明的,但是對某些特定的應用並不如此,因此如果涉及到用sequence大小來判斷資料插入先後的應用,應該在上RAC前增加一個DATE型別的欄位來判斷資料插入先後,或者設定sequence的cache為0,以保證應用的正確性。(UPDATE ON 2007-06-27:問題總是有被解決的方法,今天發現自己觀察太不仔細了,其實sequence建立選項中有一個order的關鍵字,使用此關鍵字就可以保證sequence大小一致。但是這樣設定會損失一部分效能,有人做過測試,大概損失1/3的效能。如果對sequence的取值達不到每秒鐘幾十次,則order帶來的影響可以忽略。)

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25016/viewspace-904071/,如需轉載,請註明出處,否則將追究法律責任。

相關文章