gpt4 book ai didi

sql - 从两个 session (Oracle) 插入相同值的唯一列

转载 作者:行者123 更新时间:2023-12-02 11:19:16 25 4
gpt4 key购买 nike

我有一个问题:
我有一个带有唯一约束的列的表 T

CREATE TABLE T (ID NUMBER,
UNIQUE (ID));

第一期 完成插入该表
INSERT INTO T(id) VALUES(1);

第二场 正在尝试将相同的值合并到该表
 MERGE INTO t
USING (SELECT 1 col FROM dual) s
ON (t.id = s.col)
WHEN NOT MATCHED THEN
INSERT (id) VALUES (col);

此时 session 2 被阻塞并等待 session 1 被提交或回滚。
现在我跑在 第一期
COMMIT;

在那一刻, 中发生了错误。第二场

ORA-00001: unique constraint violated



有什么办法可以避免吗?

附言问题是我在同一个表中插入了一些表和 MERGE(在 ON 部分使用 UNIQUE 列)。此 INSERT 和 MERGE 在两个不同的 session 中分别调用。有时 MERGE 会因为上面描述的情况而下降。
我希望我可以理解地描述它

最佳答案

您的示例是 phantom reads problem 的子集.幻读和您的问题只是关系数据库的一个属性。我建议阅读 Kleppmann 的第 7 章 Designing Data-Intensive Applications .

您的选择不能掉以轻心:

  • 使用 optimistic locks 重新设计应用程序.
  • 更改 database isolation level SERIALIZABLE,这既会减慢单个事务的速度,又会降低数据库并行运行事务的能力。

  • 根据我的经验,大多数设计师选择第三种选择来解决问题。根据您的非功能性需求,保持应用程序简单而不是理论上正确可能更好。

    关于sql - 从两个 session (Oracle) 插入相同值的唯一列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43776427/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com