微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

数据库 – Oracle序列缓存

我正在尝试在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.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐