我有几个在单个WebLogic集群中运行的J2EE应用程序实例。
在某些时候,这些应用程序会进行合并以将记录插入或更新到后端Oracle数据库中。MERGE检查是否存在具有指定主键的行。如果在那里,请更新。如果没有,请插入。
现在,假设有两个应用程序实例要插入或更新主键= 100的行。假设该行不存在。在合并的“检查”阶段,他们都看到行不在此处,因此他们都试图插入。然后,我得到了唯一的键约束违规。
我的问题是:Oracle中是否存在原子合并?我正在寻找一种与INSERT ... FOR UPDATEPL / SQL中的效果类似的东西,除了我只能从我的应用程序中执行SQL。
INSERT ... FOR UPDATE
编辑:我不清楚。我仍在使用MERGE语句,但仍然出现此错误。问题是,只有“修改”部分是原子的,而不是整个合并。
在该会话提交之前,第二个会话中的MERGE语句无法“看到”第一个会话进行的插入。如果减小交易的大小,则发生这种情况的可能性将减小。
或者,您可以对数据进行排序或分区,以便将给定主键的所有记录分配给同一会话。像“主键mod N”这样的简单功能应平均分配给N个会话。
顺便说一句,如果两个记录具有相同的主键,则第二个将覆盖第一个。听起来有点奇怪。