[英]INSERT into unique column same value from two sessions (Oracle)
我有一个问题:我有一个表T,其中一列具有唯一约束
CREATE TABLE T (ID NUMBER,
UNIQUE (ID));
会话1完成插入该表
INSERT INTO T(id) VALUES(1);
第2节尝试将相同的值合并到该表
MERGE INTO t
USING (SELECT 1 col FROM dual) s
ON (t.id = s.col)
WHEN NOT MATCHED THEN
INSERT (id) VALUES (col);
此时会话2被阻止并等待会话1被提交或回滚。 现在我在第1节中运行
COMMIT;
此时会话2中发生错误
ORA-00001:违反了唯一约束
有什么选择我怎么能避免它?
PS的问题是我在同一个表中INSERT到某个表和MERGE(在ON部分使用UNIQUE列)。 此INSERT和MERGE在两个不同的会话中单独调用。 有时MERGE会因为上面描述的情况而下降。 我希望我把它描述得可以理解
您的示例是幻像读取问题的一个子集。 幻影读取,您的问题只是关系数据库的属性。 我建议阅读Kleppmann 设计数据密集型应用的第7章。
你的选择不能掉以轻心:
根据我的经验,大多数设计师选择与问题共存的第三种选择。 根据您的非功能性要求,最好保持您的应用程序简单而不是理论上正确。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.