SQL并发插入问题

时间:2014-06-18 07:06:59

标签: sql postgresql

我有一个关系y(k, v),其中k是一个关键。 在数据库上有并发连接,我在每个连接上运行:

INSERT INTO y 
     SELECT 'k1', 'v1' WHERE NOT EXISTS (SELECT 1 FROM y WHERE k = 'k1');

有时我会收到以下错误:

ERROR: duplicate key value violates unique constraint "y_pk"

为什么会这样?可以避免吗?

2 个答案:

答案 0 :(得分:1)

这里的问题是,如果此查询同时在两个不同的连接中运行,那么对于BOTH(它在插入之前进行测试),NOT EXISTS条件为真,然后BOTH连接INSERT相同的值。您需要表锁或尝试使用此脚本:

BEGIN
    INSERT INTO Y(k,v) VALUES ('k1', 'v1');
    EXCEPTION WHEN unique_violation THEN
END;

另请阅读此类似主题:SO:How do I do an UPSERT...

答案 1 :(得分:0)

从PostgreSQL 9.5开始,UPSERTS本身就被支持,并将解决这个用例。