序列可以保证给定的顺序吗?

Can a sequence guarantee the given order?

使用这个 Oracle 序列定义:

CREATE SEQUENCE MY_SPECIAL_COUNTER
  START WITH 100
  INCREMENT BY -1
  MAXVALUE 100
  MINVALUE 0
  NOCYCLE
  NOCACHE
  ORDER
  ;

是否保证此序列将始终 return

正确的数字?

是的,序列将 return 每个数字一次,从 100 开始,逐渐下降到 0。

是的,它将 return 它们按从 100 到 0 的顺序排列。

正确,它不会跳过任何数字。

多个会话?视情况而定。

考虑以下几点:

  create table junk ( id   number );

  CREATE SEQUENCE MY_SPECIAL_COUNTER
    START WITH 100
    INCREMENT BY -1
    MAXVALUE 100
    MINVALUE 0
    NOCYCLE
    NOCACHE
    ORDER
    ;

  -- in session 1 do the following:
  insert into junk
     select my_special_counter.nextval from dual;

  insert into junk
     select my_special_counter.nextval from dual;

  SQL> select * from junk;

          ID
  ----------
         100
          99

  SQL>

  -- in session 2 do the following:
  insert into junk
     select my_special_counter.nextval from dual;

  SQL> select * from junk;

          ID
  ----------
          98

  SQL> commit;

  -- in session 1 do the following:
  rollback;

  -- in session 3 do the following:
  SQL> select * from junk;

          ID
  ----------
          98

  SQL>

如您所见,一旦引入多个会话,就会发生各种有趣的事情。数字可以是 "lost" 或 "skipped" .. 请注意,这不是执行此操作的序列,而是会话或提取序列值然后随后将其丢弃的人(即作业中止和回滚,逻辑错误等)

此外,如果会话 1 先拉序列,但会话 2 先提交,其他人将 "think" 会话 2 插入一个数字 "out of order" .. 所以为了理解你在追求什么,我们真的需要详细了解您的要求才能提供进一步的建议。

但是,这应该可以帮助您正确理解序列。 :) 祝你好运!