Oracle序列间隙问题:未使用的序列值是否会被复用?
Oracle序列间隙问题解答
核心结论
你提到的这些未被获取的序列值会永久丢失,不会再被使用。
原因分析
你的序列设置了CACHE 20和NOORDER,这两个参数直接导致了并行场景下的大幅间隙:
- 缓存机制的影响:当序列开启缓存(
CACHE 20),Oracle会一次性预分配20个序列值给请求的会话。如果该会话在用完这20个值之前就终止(比如连接断开、事务异常回滚、进程意外结束),剩余未使用的预分配值会被直接丢弃,永远不会再被序列分配。 - NOORDER的作用:
NOORDER参数允许Oracle不按请求顺序分配序列值,并行调用时不同会话会拿到不同的缓存块。如果多个会话的缓存块未被完全利用就终止,就会出现多个缓存段的丢失,最终表现为大幅的序列值跳跃。
额外说明
你提到连续生成时因校验位产生的预期小间隙,和并行场景的大幅跳跃本质不同:前者是你在函数中对序列值进行校验位处理时可能跳过了某些值(比如获取序列值后发现校验位不符合规则,直接丢弃并取下一个),但这些被跳过的序列值已经被序列“消耗”;后者则是序列本身预分配的缓存值因会话异常未使用而永久丢失,这些值永远不会再被序列生成。
内容的提问来源于stack exchange,提问作者Till Glöckner
相关产品推荐
相关产品推荐

