Oracle序列nextval是来回跳跃的数字

本文关键字:跳跃 数字 序列 nextval Oracle | 更新日期: 2023-09-27 18:10:23

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

两个web服务正在向表插入行,但是mySequence.nextval返回的是无序的数字

下面是如何创建记录的,显示PrimaryKeymySequence.nextval

获取其值

1 21 22 23 23 24 25 4 27 28 5

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

更新:序列是用cache_size = 20

Oracle序列nextval是来回跳跃的数字

创建的

我打赌您的数据库正在运行RAC(真实应用程序集群)。假设是这种情况,并且您使用所有默认设置创建序列,这就是预期的行为。

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

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

From the docs…

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

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