Oracle SQL Developer - >手动改变序列增量10 - >需要提交

时间:2017-09-25 14:49:25

标签: oracle11g oracle-sqldeveloper

如果我使用连接到11gR2的Oracle Sql Developer并执行:

ALTER SEQUENCE myCounter INCREMENT BY 10;

我是否需要提交此声明。如果我执行此语句并且在按下绿色提交按钮之前网络连接丢失,序列是否仍会增加10?

我不完全理解Oracle writes in their documentationWhen a sequence number is generated, the sequence is incremented, independent of the transaction committing or rolling back.

1 个答案:

答案 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环境中,每个节点都有自己的缓存,并将从这些缓存中进行分配。