RAC环境下的SEQUENCE对应用的影响

生产系统上了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带来的影响可以忽略。)

请使用浏览器的分享功能分享到微信等