Oracle缺少序列号

时间:2014-07-09 17:30:34

标签: oracle auto-increment

我使用序列在Oracle中生成自动增量ID。每次插入之前,我都会触发从序列中提取数字。

CREATE SEQUENCE  "my_SEQ"  MINVALUE 1 MAXVALUE 9999999999 INCREMENT BY 1 START WITH 1 CACHE 5000 NOORDER  NOCYCLE;

我发现缺少5000(与缓存相同)编号。例如,我的第一次尝试给了我id 1,当我稍后回来时,第二个插入生成了一个500的id。Oracle文档说"如果发生系统故障,所有未提交的缓存序列值DML语句丢失了。 "谁能解释一下这里发生了什么?提前致谢。

1 个答案:

答案 0 :(得分:3)

当从序列中提取新值时,DB需要将此信息写入磁盘,因此如果出现故障 - 重新启动后不会发生冲突。

将每个数字都写到磁盘上是不合适的。

要解决Oracle可以缓存的问题,因此当您请求一个值时,DB会提取一些预定义的数字(在您的情况下为5000)并将该信息写入磁盘。如果出现数据库故障,这些值永远不会被重用。

您还指定了NOORDER。这意味着您可以不按顺序获取数字。 它比使用ORDER更有效。

其他材料:

Oracle API for sequences

Tom Kyte descussion about sequences

Read this if you are using RAC