一尘不染

Oracle Sequence nextval正在来回跳转数字

sql

我创建了一个新表和一个新序列,我有两个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创建序列


阅读 179

收藏
2021-03-17

共1个答案

一尘不染

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

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

通常,这应该不成问题。序列生成唯一的数字。这些数字通常不必是连续的。如果您确实需要按顺序返回值,因为您正在执行一些操作,例如按序列生成的值排序以确定“第一”或“最后”行,则可以ORDER在创建序列时使用该子句来强制返回值为了。但是,这对RAC数据库具有负面的性能影响,因为它增加了节点之间进行同步以返回值同步所需的通信量。如果您需要确定“第一行”或“最后一行”,date``timestamp

2021-03-17