971
社区成员




Linux环境:SUSE 15 sp3
在执行pgsql语句时候,先判断主键不存在再插入数据,结果报错。
基本的语句如下(省略了多余的内容):
INSERT INTO image ( image_uuid, image_series_uuid )
SELECT 'd9aaf41a-9c88-488b-b371-0c0bb1165a4f', '85c4a85a-10de-47d3-8af5-1c090e119a86'
WHERE NOT EXISTS (
SELECT 1 FROM image WHERE image_uuid = 'd9aaf41a-9c88-488b-b371-0c0bb1165a4f'
);
报错如下:
duplicate key value violates unique constraint "image_pkey"
--------
DETAIL: Key (image_uuid)=(d9aaf41a-9c88-488b-b371-0c0bb1165a4f) already exists.
SCHEMA NAME: public
TABLE NAME: image
CONSTRAINT NAME: image_pkey
_bt_check_unique, nbtinsert.c:656
这时候数据库可能处于checkpoint状态,执行有一个平时几十毫秒的事务花费4s多。
你SELECT 未加锁,可能出现2个进程同时操作该语句,特别在并发量大的情况下
两个解决方法:
1、SELECT后面加排它锁 FOR UPDATE
2、INSERT 加语句 ON DUPLICATE KEY DO NOTING,主键存在时不插入
建议用第2种方法