如果我使用连接到11gR2的Oracle Sql Developer并执行:
ALTER SEQUENCE myCounter INCREMENT BY 10;
我是否需要提交此声明。如果我执行此语句并且在按下绿色提交按钮之前网络连接丢失,序列是否仍会增加10?
我不完全理解Oracle writes in their documentation:
When a sequence number is generated, the sequence is incremented, independent of the transaction committing or rolling back.
答案 0 :(得分:2)
您的alter
语句不需要提交,因为它是DDL而不是DML。丢失连接不会有任何影响。但它本身也不会增加序列值。
它的作用是修改序列定义,以便下次和每个后续时间nextval
被调用时,生成的数字将增加10而不是之前设置的任何值。 (默认值为1)。
快速演示:
CREATE SEQUENCE myCounter;
Sequence MYCOUNTER created.
SELECT myCounter.nextval from dual;
NEXTVAL
----------
1
SELECT myCounter.nextval from dual;
NEXTVAL
----------
2
SELECT myCounter.nextval from dual;
NEXTVAL
----------
3
因此,默认情况下,序列每次增加1。然后在你改变它之后,每次调用nextval
增加10而不是1:
ALTER SEQUENCE myCounter INCREMENT BY 10;
Sequence MYCOUNTER altered.
SELECT myCounter.nextval from dual;
NEXTVAL
----------
13
SELECT myCounter.nextval from dual;
NEXTVAL
----------
23
alter
本身没有用完或跳过10个值 - 否则第一个nextval
将得到23而不是13.它只改变了定义。
您所引用的文档是说如果您回滚,则不会再次生成任何先前发布的数字:
ROLLBACK;
Rollback complete.
SELECT myCounter.nextval from dual;
NEXTVAL
----------
33
你得到33,而不是23。发出一个值,然后不再可用于任何其他会话(包括您自己的会话)从另一个nextval
调用获取 - 无论是回滚还是提交,或者该值是否实际用于任何事情。 (如果序列设置为cycle
,最终可能会重新发布,但默认情况下不会重新发布。)
另请注意,序列生成不是无间隙的,并不是因为处理回滚的方式以及缓存机制的工作原理。这些数字也不总是严格按顺序发布 - 在RAC环境中,每个节点都有自己的缓存,并将从这些缓存中进行分配。