我创建了一个新表和一个新序列,我有两个C#Web服务尝试使用mySequence.nextval
使用相同的查询将记录插入此表(是的,我检查了很多次,它们都使用{{1 }})。
两个Web服务正在向表中插入行,但mySequence.nextval
正在不按顺序返回数字
以下是记录的创建方式,显示mySequence.nextval
从PrimaryKey
1 21 22 23 2 3 24 25 4 27 28 5
到目前为止没有重复,但为什么mySequence.nextval
来回跳跃?我应该担心吗
更新 使用cache_size = 20
创建序列答案 0 :(得分:13)
我会打赌您的数据库正在运行RAC(Real Application Clusters)。假设是这种情况,并且您使用所有默认设置创建序列,那就是预期的行为。
默认设置是缓存20个值。默认情况下,RAC群集中的每个节点都有一个单独的缓存。假设您有一个具有两个节点A和B的集群,第一次在A上请求nextval
时,A将缓存值1-20并返回值1.如果下一个请求{{1在B上生成,B将缓存值21-40并返回值21.从那里,您获得的值将取决于您的连接正在运行的节点。
一般来说,这应该不是问题。序列生成唯一的数字。数字通常不需要是连续的。如果您确实需要按顺序返回值,因为您正在通过序列生成的值进行排序以确定“第一行”或“最后”行,则可以在创建序列时使用nextval
子句强制值按顺序返回。但是,这在RAC数据库中具有负面的性能影响,因为它增加了节点之间需要进行的通信量,以同步返回的值。如果您需要确定“第一行”或“最后一行”,通常最好将ORDER
或date
列添加到表中并按顺序排序,而不是假设生成主键顺序。
答案 1 :(得分:1)
来自文档...
序列号是独立于表生成的,因此相同的序列可用于一个或多个表。单个序列号可能会被跳过,因为它们是在最终回滚的事务中生成和使用的。此外,单个用户可能没有意识到其他用户正在使用相同的序列。
http://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_6015.htm#SQLRF01314