Oracle序列

        最近在做一个抽奖的业务时,用到了Oracle序列,但是线网数据库上线后出现了一个小bug,不得不去重新认识下Oracle的序列。

总结几点

(1)序列适合生成唯一且连续的主键值,但是个人认为不太适合生成具有业务意义的字段,在这个业务中用生成的序列作为用户抽奖编号,以此判断用户是否中奖,具有业务意义的字段,是否用max函数去生成这个编号会更好,但是使用max函数的话会不会有并发问题。使多个用户抽到同一个编号

(2)当使用到序列的事务发生回滚。会造成序列号不连续。在用生成的序列值作为抽奖编号做插入数据库操作时,可能遇到事务提交失败,从而导致序号不连续。

(3)大量语句发生请求,申请序列时,为了避免序列在运用层实现序列而引起的性能瓶颈。Oracle序列允许将序列提前生成 cache x个先存入内存,在发生大量申请序列语句时,可直接到运行最快的内存中去得到序列。但cache个数也不能设置太大,因为在数据库重启时,会清空内存信息,预存在内存中的序列会丢失,当数据库再次启动后,序列从上次内存中最大的序列号+1 开始存入cache x个。这种情况也能会在数据库关闭时也会导致序号不连续。


下面学习下Oracle的序列

其实说起序列这个其实很简单,但是如果只不了解的话还是会在上面栽跟头。

1Create Sequence
 (
注释:你需要有CREATE SEQUENCECREATE ANY SEQUENCE权限)
  CREATE  SEQUENCE  SEQ_EXAMPLE
  INCREMENT  BY  1 ——
每次加几个
  
START  WITH 1 —— 开始计数
  MAXVALUE 999999999—— 最大值
  
NOMAXVALUE —— 不设置最大值
  NOCYCLE ——
一直累加,不循环

CYCLE

CACHE 10;—— 不设置缓存大小


 只要定义了
SEQ_EXAMPLE ,你就可以用使CURRVALNEXTVAL
 CURRVAL=
返回 sequence的当前值
 NEXTVAL=
增加sequence的值,然后返回 sequence
 
例如:
 
SEQ_EXAMPLE.CURRVAL
 
SEQ_EXAMPLE.NEXTVAL

 

//查询序列的当前值

select  SEQ_EXAMPLE.currval  from  dual;

 需要注意的是:
   第一次NEXTVAL返回的是初始值;随后的NEXTVAL会自动增加你定义的INCREMENT BY值,然后返回增加后的值。CURRVAL 总是返回当前SEQUENCE的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否则会出错。一次NEXTVAL会增加一次 SEQUENCE的值,所以如果你在同一个语句里面使用多个NEXTVAL,其值就会是不一样的。
 -
假如指定CACHE值,Oracle就可以预先在内存里面放置一些sequence,这样存取的快些。cache里面的取完后,Oracle自动再取一组 到cache. 使用cache或许会跳号, 比如数据库突然不正常down(shutdown abort)cache中的sequence就会丢失。 所以可以在create sequence的时候用nocache防止这种情况。
 2
Alter Sequence
  
你需要有sequenceowner,或者拥有ALTER ANY SEQUENCE 权限才能改动sequence. 可以alterstart至以外的所有sequence参数。如果想要改变start值,必须 drop sequence re-create .
   Alter sequence
示例:
 ALTER SEQUENCE emp_sequence INCREMENT BY 10 MAXVALUE 10000 CYCLE --
10000后从头开始 NOCACHE ;
 
可以影响Sequence的初始化参数:
 SEQUENCE_CACHE_ENTRIES =
设置能同时被cachesequence数目。
 3
Drop Sequence
     DROP SEQUENCE 
SEQ_EXAMPLE ;

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值