【发布时间】:2017-10-19 14:06:00
【问题描述】:
我使用这样的查询:
INSERT INTO table
SELECT * FROM table2 t2
JOIN ...
...
WHERE table2.date < now() - '1 day'::INTERVAL
FOR UPDATE OF t2 SKIP LOCKED
ON CONFLICT (...)
DO UPDATE SET ...
RETURNING *;
我的问题是关于FOR UPDATE t2 SKIP LOCKED。我应该在这里使用它吗?或者 Postgres 会自动使用INSERT SELECT ON CONFLICT 锁定这些行直到事务结束?
我的目标是防止其他应用程序(同时)捕获具有内部 SELECT 的行,这些行已被此应用程序捕获。
【问题讨论】:
-
没有理由自动锁定来自
INSERT ... ON CONFLICT中子查询的行,因为子查询执行一次。您应该明确锁定行。
标签: sql postgresql concurrency locking upsert