美图欣赏 | 设为首页 | 加入收藏 | 网站地图

当前位置:电脑中国 > 数据库 > oracel >

ORACLE SEQUENCE跳号总结

2017-09-01 10:13|来源:未知 |作者:dnzg |点击:
  在ORACLE数据库中,序列(SEQUENCE)是使用非常频繁的一个数据库对象,但是有时候会遇到序列(SEQUECNE)跳号(skip sequence numbers)的情形,那么在哪些情形下会遇到跳号呢?
 
 
事务回滚引起的跳号
 
 
不管序列有没有CACHE、事务回滚这种情况下,都会引起序列的跳号。如下实验所示:
 
SQL> create sequence my_sequence
  2  start with 1
  3  increment by 1
  4  maxvalue 99999
  5  nocache;
 
Sequence created.
 
SQL>  create table test(id number(10), name varchar2(32));
 
Table created.
 
SQL> insert into test
  2  select my_sequence.nextval , 'kerry' from dual;
 
1 row created.
 
SQL> 
SQL> rollback;
 
Rollback complete.
 
SQL> select my_sequence.nextval from dual;
 
   NEXTVAL
----------
         3
 
SQL> 
clip_image001
 
 
并发访问序列引起的跳号
 
 
并发访问序列引起的跳号,其实不算真正的跳号,而只是逻辑跳号,只是序列值被其它并发会话使用了。我们来构造一起并发访问序列引起的跳号,我们开启两个会话窗口,循环获取序列的值,模拟并发出现的场景。
 
会话窗口A:
 
exec dbms_lock.sleep(2); --延迟2秒执行,根据你实验情况调整
/
begin
    for i in 1 .. 2000 loop
        dbms_output.put_line(my_sequence.nextval);
    end loop;
end;
/
 
会话窗口B:
 
spool test.txt;
begin
    waitfor delay '00:00:10';
    for i in 1 .. 2000 loop
        dbms_output.put_line(my_sequence.nextval);
    end loop;
end;
/
spool off; 
 
如下所示,我构造的实验当中,你会看到序列的跳号情况。
 
 
clip_image002
 
 
 
FLUSH SHARED_POOL会导致CACHE的序列跳号
 
 
实验测试如下所示(序列的CACHE值必须大于0),当然正常情况下,很难遇到这种情况。
 
SQL> select test.my_sequence.nextval from dual;
 
   NEXTVAL
----------
     17004
 
SQL> alter sequence test.my_sequence cache 40;
 
Sequence altered.
 
SQL> select test.my_sequence.nextval from dual;
 
   NEXTVAL
----------
     17005
 
SQL> alter system flush share_pool;
alter system flush share_pool
*
ERROR at line 1:
ORA-02000: missing SHARED_POOL/BUFFER_CACHE/GLOBAL CONTEXT keyword
 
 
SQL> alter system flush shared_pool;
 
System altered.
 
SQL> select test.my_sequence.nextval from dual;
 
   NEXTVAL
----------
     17045
 
 
clip_image003
 
 
数据库实例异常关闭导致跳号
 
 
如下实验所示,当数据库使用shutdown abort命令关闭后,重新启动实例,序列缓存在shared pool里面没有用过的值都没有了。一下子从17045跳到17085
 
SQL> select test.my_sequence.currval from dual;
 
   CURRVAL
----------
     17045
 
SQL> select object_id from dba_objects where object_name=upper('my_sequence');
 
 OBJECT_ID
----------
     97760
 
SQL> select increment$, minvalue, maxvalue,highwater, cache
  2  from seq$ where obj#=97760;
 
INCREMENT$   MINVALUE   MAXVALUE  HIGHWATER      CACHE
---------- ---------- ---------- ---------- ----------
         1          1      99999      17085         40
					
(责任编辑:dnzg)