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

时间:2016-01-08 13:54:36

标签: oracle oracle11g oracle12c

使用此Oracle序列定义:

while (c!=s2.charAt(k)) {
    k++;
}

是否有保证,此序列将始终返回

  • 每个数字一次从100到0
  • 按给定顺序从100到0和
  • 不会提出任何单一号码
  • 独立于请求当前的多个并发会话

正确的号码?

1 个答案:

答案 0 :(得分:3)

是的,序列将返回每个数字一次,从100开始,逐步减少到0。

是的,它会按顺序将它们从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>

正如您所看到的,一旦您引入多个会话,就会发生各种有趣的事情。数字可以“丢失”或“跳过”..请注意,它不是执行此操作的序列,而是会话或任何人拉动序列值然后随后丢弃它(即作业异常终止,回滚,逻辑错误等)

此外,如果会话1首先拉序列,但会话2首先提交,其他人会“认为”会话2插入一个“乱序”的数字..所以要了解你所追求的是什么,我们真的需要了解你的要求进一步提出建议。

然而,这应该有助于您正确理解序列。 :) 祝你好运!