我正在尝试在Oracle数据库中实现一个序列,以充当表的代理键创建者.出于性能原因,我希望缓存此序列.我已经读过使用缓存序列时存在潜在的缺陷,因为回滚和实例失败会导致错过值.
这让我思考.假设我创建了一个缓存大小为100的序列.然后我将50条记录插入到我的表中,序列值作为主要代理键.提交后,序列的当前值尚未写入磁盘.假设我此时有一个实例失败.当数据库恢复时,我理解当前序列值将重置为写入磁盘的最后一个值.
如果我要尝试在我的表中插入另外50条记录,我现在是否会破坏主键约束,因为序列已从磁盘重置为其最后一个状态,主键现在正在被重用?如果是这种情况,我该如何防止这种情况?
当我发现一个有趣的行为时,我今天在10g创建了一张新桌子.这是我做的一个例子:
CREATE TABLE test_table ( field_1 INTEGER PRIMARY KEY );
Run Code Online (Sandbox Code Playgroud)
默认情况下,Oracle会为主键创建一个非null的唯一索引.我仔细检查过这个.快速检查后,我找到一个唯一的索引名称SYS_C0065645.到目前为止,一切都按预期工作.现在我这样做了:
CREATE TABLE test_table ( field_1 INTEGER,
CONSTRAINT pk_test_table PRIMARY KEY (field_1) USING INDEX (CREATE INDEX idx_test_table_00 ON test_table (field_1)));
Run Code Online (Sandbox Code Playgroud)
在描述我新创建的索引idx_test_table_00之后,我发现它是非唯一的.我尝试将重复数据插入表中,并由主键约束停止,证明该功能未受影响.我觉得很奇怪,Oracle会允许将非唯一索引用于主键约束.为什么允许这样做?
我正在为一个系统绘制一个设计,为我的公司做日常业务.它将包含一个带有Pl/SQL包的Oracle 10g数据库和一个基于Java的Web应用程序.所有这些都在Solaris 10服务器上运行.除了从Web界面处理事务外,还需要在数据库上运行计划任务以运行计算和加载数据等.
这是遗留系统的重新设计,目前通过大量的cron作业来控制所有内容.鉴于重新设计它的任务,你会采用不同的方式吗?我知道Oracle有自己的任务调度程序,但DBA认为他会重新考虑使用它,因为如果数据库由于某种原因而关闭或脱机,它就无法发送警报或记录任何类型的错误.如果其中一个任务失败,cron作业当前可以发送SMS消息或电子邮件.另一个选择是让Web应用程序以某种方式执行它.
你有什么建议?