【问题标题】:Oracle Missing Sequence NumberOracle 缺少序列号
【发布时间】:2014-08-30 20:44:39
【问题描述】:

我正在使用序列在 Oracle 中生成自动增量 ID。而且我有一个触发器可以在每次插入之前从序列中提取数字。

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

我发现缺少 5000 个(与缓存相同)号码。例如,我的第一次尝试给了我 id 1,当我稍后回来时,第二次插入生成的 id 为 5001。Oracle 文档说“如果发生系统故障,所有未在提交的 DML 语句中使用的缓存序列值都是迷路了。” 谁能解释这里发生了什么?提前致谢。

【问题讨论】:

    标签: oracle auto-increment


    【解决方案1】:

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

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

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

    您还指定了 NOORDER。这意味着你可以让数字乱序。 它比使用 ORDER 更有效。

    补充材料:

    Oracle API for sequences

    Tom Kyte descussion about sequences

    Read this if you are using RAC

    【讨论】:

      猜你喜欢
      • 2021-11-10
      • 2019-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多