序列可以保证给定的顺序吗?
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
- 从100到0每个数字一次
- 按照从 100 到 0 的给定顺序
- 不会遗漏任何一个号码
- 在请求的那一刻独立于多个并发会话
正确的数字?
是的,序列将 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" .. 所以为了理解你在追求什么,我们真的需要详细了解您的要求才能提供进一步的建议。
但是,这应该可以帮助您正确理解序列。 :)
祝你好运!
使用这个 Oracle 序列定义:
CREATE SEQUENCE MY_SPECIAL_COUNTER
START WITH 100
INCREMENT BY -1
MAXVALUE 100
MINVALUE 0
NOCYCLE
NOCACHE
ORDER
;
是否保证此序列将始终 return
- 从100到0每个数字一次
- 按照从 100 到 0 的给定顺序
- 不会遗漏任何一个号码
- 在请求的那一刻独立于多个并发会话
正确的数字?
是的,序列将 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" .. 所以为了理解你在追求什么,我们真的需要详细了解您的要求才能提供进一步的建议。
但是,这应该可以帮助您正确理解序列。 :) 祝你好运!