在节点一上:
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/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/25016/viewspace-904071/