【发布时间】:2014-02-20 09:48:43
【问题描述】:
我在 oracle 11g 中有这个表。
TABLE: ORDER_LOCK
Name Null Type
---------------------- -------- ----------
ORDER_ID NOT NULL NUMBER(10) [PRIMARY KEY]
ORDER_REF_ID NUMBER(10) [UNIQUE KEY]
ORDER_MSG_SENT NUMBER(1)
merge into ORDER_LOCK al
using ( select ? ORDER_REF_ID, ? ORDER_MSG_SENT from dual ) t
on (al.ORDER_REF_ID = t.ORDER_REF_ID)
when not matched then
insert (ORDER_ID, ORDER_REF_ID, ORDER_MSG_SENT)
values (ORDER_LOCK_SEQ.nextval, t.ORDER_REF_ID, t.ORDER_MSG_SENT)
我正在从我的应用程序 (Java) 中使用上述合并。合并调用来自多个线程。代码一直运行良好,但昨天我们在唯一键“ORDER_REF_ID”上遇到约束违规 (ORA-00001)。
Merge 语句有问题吗?或者,上面的 Merge 语句可能会导致违反约束,是否有任何特定场景?
谢谢
普什卡
【问题讨论】:
-
您是否通过尝试插入相同的 order_ref_id 来检查两个或多个线程是否可能?