ITPub博客

首页 > 数据库 > Oracle > RAC环境下的SEQUENCE对应用的影响

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

原创 Oracle 作者:zhang41082 时间:2019-01-26 09:24:05 0 删除 编辑
生产系统上了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博客 ” ,链接:https://blog.itpub.net/25016/viewspace-904071/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: EBS Documentations
请登录后发表评论 登录
全部评论

注册时间:2002-10-11

  • 博文量
    105
  • 访问量
    122259