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数据库中具有负面的性能影响,因为它增加了节点之间需要进行的通信量,以同步返回的值。 如果您需要确定“第一行”或“最后一行”,通常最好向表中添加date
或timestamp
列并按顺序排序,而不是假设主键是按顺序生成的。
来自文档……
序列号是独立于表生成的,因此相同的序列可用于一个或多个表。 单个序列号可能会被跳过,因为它们是在最终回滚的事务中生成和使用的。 另外,单个用户可能没有意识到其他用户正在从相同的序列中绘制。
http://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_6015.htm#SQLRF01314