一直以来,以为sequence是不间断地持续增长的;但今天发现sequence是会跳号,这种情况发生在RAC环境下。在单实例环境下,应该不存在的。

sequence截图如下:

数据库表中发生了跳号:

查看了实例db1:

查看了实例db2:

通过pl/sql查看nextval

从上面我们知道,在RAC环境下,sequence确实会发生跳号现象。但不管如何,sequence是不会重复的。

下面是从网上查找的深层次原因:

oracle为了在rac环境下为了sequence的一致性,使用了三种锁:row cache lock、SQ锁、SV锁。

row cache lock的目的是在sequence指定nocache的情况下调用sequence.nextval过程中保证序列的顺序性;

SQ锁是应用于指定了cache+noorder的情况下调用sequence.nextval过程中。

SV锁(dfs lock handel) 是调用sequence.nextval期间拥有的锁。前提是创建sequence时指定了cache 和order属性 (cache+order)。

order参数的目的是为了在RAC上节点之间生成sequence的顺序得到保障。

创建sequence赋予的cache值较小时,有enq:sq-contention等待增加的趋势。

cache的缺省值是20.因此创建并发访问多的sequence时,cacheh值应取大一些。否则会发生enq:sq-contention等待事件。

rac上创建sequence时,如果指定了cache大小而赋予noorder属性,则各节点将会把不同范围的sequence值cache到内存上。若两个节点之间都必须通过依次递增方式使用sequence,必须赋予如下的order属性(一般不需要这样做)"sql> create sequence seq_b cache 100 order"。如果是已赋予了cache+order属性的sequence,oracle使用SV锁进行同步。SV锁争用问题发生时的解决方法与sq锁的情况相同,就是将cache 值进行适当调整。

    在RAC多节点环境下,Sequence的Cache属性对性能的影响很大。应该尽量赋予cache+noorder属性,并要给予足够的cache值。如果需要保障顺序,必须赋予cache+order属性。但这时为了保障顺序,实例之间需要不断的交换数据。因此性能稍差。

最新文章

  1. 代码的坏味道(11)——霰弹式修改(Shotgun Surgery)
  2. Twitter面试题蓄水池蓄水量算法(原创 JS版,以后可能会补上C#的)
  3. 基于Netbeans的PHPUnit单元测试环境搭建
  4. daydayup3 codeforces144C
  5. Jmeter模拟不同带宽
  6. web开发工具软件使用问题记录
  7. JAVA里面的IO流(一)分类2(节点流和处理流及构造方法概要)
  8. 【转】JavaScript中undefined与null的区别
  9. Android导入Cocos2D的Sample项目
  10. java学习多线程之生产者消费者
  11. 保留你的dSYM文件
  12. WPF中当鼠标移到按钮上时,按钮的背景图片消失的问题
  13. a href="javascript:void(0)" 是什么意思?加不加上有什么区别?
  14. Python 的装饰器
  15. windows下网络编程UDP
  16. 【原创】大数据基础之CM5(Cloudera Manager)+CDH5离线安装
  17. c# 线程锁 ,
  18. C++11 并发指南四(<future> 详解一 std::promise 介绍)
  19. 使用paramiko远程执行命令、下发文件
  20. spring配置redis注解缓存

热门文章

  1. LeetCode OJ--Remove Duplicates from Sorted List II *
  2. 发布npm包
  3. NOIPSB评测机+SB题DAY2
  4. 用canal监控binlog并实现mysql定制同步数据的功能
  5. java之 ------ 文件的输入、输出(一)
  6. MFC 小知识总结三
  7. C#中使用byte[]数据,生成Bitmap
  8. PJzhang:python基础入门的7个疗程-two
  9. 走入asp.net mvc不归路:[3]创建控制器
  10. 我所见过的最简短、最灵活的javascript日期转字符串工具函数