Oracle Sequence nextval是来回跳转的数字

EGN*_*EGN 10 c# sql database oracle sequence

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

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

以下是记录的创建方式,显示了PrimaryKey哪些记录的价值mySequence.nextval

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

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

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

Jus*_*ave 13

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

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

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