我正在尝试在Oracle数据库中实现一个序列,以充当表的代理键创建者.出于性能原因,我希望缓存此序列.我已经读过使用缓存序列时存在潜在的缺陷,因为回滚和实例失败会导致错过值.
这让我思考.假设我创建了一个缓存大小为100的序列.然后我将50条记录插入到我的表中,序列值作为主要代理键.提交后,序列的当前值尚未写入磁盘.假设此时我有一个实例失败.当数据库恢复时,我理解当前序列值将被重置为写入磁盘的最后一个值.
如果我要尝试在我的表中插入另外50条记录,我现在是否会破坏主键约束,因为序列已从磁盘重置为其最后一个状态,主键现在正在被重用?如果是这种情况,我该如何防止这种情况?
解决方法
不,情况并非如此.
您的序列将在101处继续,将丢失50到100之间的值.
禁用序列缓存的唯一原因是尝试避免序列中的间隙,这与大多数主键无关.
您可能对this article感兴趣,其中说明了这一点
The downside of creating a sequence with a cache is that if a system failure occurs,all cached sequence values that have not be used,will be “lost”. This results in a “gap” in the assigned sequence values. When the system comes back up,Oracle will cache new numbers from where it left off in the sequence,ignoring the so called “lost” sequence values.