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带来的影响可以忽略。)

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25016/viewspace-904071/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/25016/viewspace-904071/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值