【发布时间】:2011-05-12 17:27:21
【问题描述】:
我有几个在单个 WebLogic 集群中运行的 J2EE 应用程序实例。
在某些时候,这些应用会执行 MERGE 以将记录插入或更新到后端 Oracle 数据库中。 MERGE 检查是否存在具有指定主键的行。如果它在那里,请更新。如果没有,请插入。
现在假设两个应用实例想要插入或更新主键 = 100 的行。假设该行不存在。在合并的“检查”阶段,他们都看到行不存在,所以他们都尝试插入。然后我得到一个唯一键约束违规。
我的问题是:Oracle 中是否有原子 MERGE?我正在寻找与 PL/SQL 中的INSERT ... FOR UPDATE 具有类似效果的东西,只是我只能从我的应用程序中执行 SQL。
编辑:我不清楚。我正在使用 MERGE 语句,而此错误仍然发生。问题是,只有“修改”部分是原子的,而不是整个合并。
【问题讨论】:
-
合并是原子的。它作为一个完整的工作单元工作或失败。您所看到的是 Oracle 实施多版本一致性的结果。听起来您正在寻找一些东西来序列化多个合并?您可以尝试使用 Oracle 的可序列化事务,但这可能只会将错误从唯一键约束更改为无法序列化事务错误。
-
我的数据库/多线程词汇可能有误。我的理解是“作为一个完整的工作单元工作或失败”被称为事务性的。通过原子,我的意思是在另一个合并正在处理时不会发生合并。关于序列化合并,我将不得不阅读相关内容。谢谢。
-
@Russell,原子性只是事务的一个属性。它确实意味着作为一个整体的成功或失败。例如,请参阅:en.wikipedia.org/wiki/ACID 和 download.oracle.com/docs/cd/E11882_01/server.112/e16508/…。
-
主键从哪里来,你可以有新的重复?
-
啊,对 ACID 的精彩回顾。谢谢。自从我上次使用数据库以来,我很久以前就没有听说过。主键来自我无法控制的外部来源。
标签: java oracle concurrency merge weblogic