我oracle2台节点的RAC环境,某个Sequence我已经设置了order, cache20。为什么生成的数据,先生成的值反而大,后生成的小,如何解决这个问题?难道order属性不起作用的?

解决方案 »

  1.   

    这个是create sequence的语句:create sequence SEQ_STEP
    minvalue 1
    maxvalue 9999999999999999999999999999
    start with 30335946
    increment by 1
    cache 20
    order;
    下面是我在表中看到的结果:30324126  2012/12/1 8:13:16
    30324128  2012/12/1 8:13:18
    30324127  2012/12/1 8:13:23照理第二行的这条数据比第三行早插入,应该获得较小的sequence,现在却是较大的?
      

  2.   

    你插入数据和取得sequence值之间有 其他操作吗?比如:先获取序列值
          再一堆操作
          最后插入数据
      

  3.   

    我是调用存储过程对这张表进行insert操作,
    insert into xx (id, updatetime) values (null, sysdate)
    在表上有一个trigger用于获取sequence.nextval插入。会有什么问题吗?
      

  4.   

    cache20的话,在node1和node2上分别保存了20个id,假设node1是1-20,node2是21-40
    那么第一个请求发送时由node2处理,给了21,第二个请求由node1处理,给了1,就会出现我上面的情况。这是我的猜测,但我不知道order这个参数是如何保证上面情况不发生的?
      

  5.   


    order保证序列产生的顺序和请求的顺序是一致的,在并行模式下如果A、B同时对序列请求那么先产生的序列号必然返回给先请求的用户。例如当前序列号为10,A先请求B后请求那么11一定返回给A,12给B,在noorder的情况下,有可能11给B,10给A并不能保证你的想法。
      

  6.   

    节点间要共享seq  本来2种方式可以解决楼主所说
    1  就是order+cache
    2  nocache
    而楼主用了第一种方式,我猜测有可能是cache过小,而调用nextval时会持有SV锁,造成先调用会话等待后反而比后调用的小---空了我验证下
      

  7.   

    30324128  2012/12/1 8:13:18
    30324127  2012/12/1 8:13:23这两行是否在同一个节点上插入的? 
    因为你这个时间是sysdate。检查下两个节点的时间是否完全一致?
      

  8.   

    时间估计不是获取到SEQUENCE的时间
      

  9.   

    把 cache 20
    修改为 nocache试试