Oracle Sequence nextval是来回跳转的数字

我创建了一个新表和一个新序列,我有两个C#Web服务尝试使用mySequence.nextval使用相同的查询将记录插入此表(是的,我检查了很多次,它们都使用mySequence.nextval )。

两个Web服务正在向表中插入行,但mySequence.nextval不按顺序返回数字

以下是创建记录的方式,显示了从mySequence.nextval获取其值的PrimaryKey

1 21 22 23 2 3 24 25 4 27 28 5

到目前为止没有重复,但为什么mySequence.nextval来回跳跃? 我应该担心吗

更新:使用cache_size = 20创建序列

我会打赌您的数据库正在运行RAC(Real Application Clusters)。 假设是这种情况,并且您使用所有默认设置创建序列,那就是预期的行为。

默认设置是缓存20个值。 默认情况下,RAC群集中的每个节点都有一个单独的缓存。 假设您有一个具有两个节点A和B的集群,第一次在A上请求nextval ,A将缓存值1-20并返回值1.如果下一个请求是在B,B上进行的将缓存值21-40并返回值21.从那里,您获得的值将取决于您的连接正在运行的节点。

一般来说,这应该不是问题。 序列生成唯一的数字。 数字通常不需要是连续的。 如果您确实需要按顺序返回值,因为您正在通过序列生成的值进行排序来确定“第一行”或“最后”行,则可以在创建序列时使用ORDER子句强制值为按顺序返回。 但是,这在RAC数据库中具有负面的性能影响,因为它增加了节点之间需要进行的通信量,以同步返回的值。 如果您需要确定“第一行”或“最后一行”,通常最好向表中添加datetimestamp列并按顺序排序,而不是假设主键是按顺序生成的。

来自文档……

序列号是独立于表生成的,因此相同的序列可用于一个或多个表。 单个序列号可能会被跳过,因为它们是在最终回滚的事务中生成和使用的。 另外,单个用户可能没有意识到其他用户正在从相同的序列中绘制。

http://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_6015.htm#SQLRF01314