我使用的是PostgreSQL
。下面是一个简化的查询:
INSERT INTO TableA
SELECT values
FROM TableB
JOIN tables
LEFT JOIN TableA
WHERE conditions
AND TableA.X IS NULL
它向TableA
中添加新记录,但前提是该记录不存在。当我按顺序运行此查询时,我只创建了一条新记录。但如果多个线程并行运行该查询会怎样?是否有可能在TableA中创建多条记录?
是否需要使用SELECT ... FOR UPDATE
来锁定TableB
中的记录?
1条答案
按热度按时间sirbozc51#
如果这两个语句同时运行,则任何一个
SELECT
都不能看到另一个的INSERT
(因为两个事务都还没有提交)。因此,它们可能会将同一行插入两次。避免这种情况的最佳方法是使用带有唯一或主键约束的
INSERT ... ON CONFLICT
。