在子查询中是否需要FOR UPDATE ?



考虑以下更新。我认为这个命名已经足够清楚了,不需要任何进一步的解释。在子查询中标识要更新的行。这里是否存在并发风险?另一个进程会"潜入"吗?在执行子查询和执行外部查询之间,预订行吗?如果是这样,我认为可以通过在子查询中执行FOR UPDATE来消除风险(参见我在查询中的评论)

UPDATE
bookableresource_slots
SET
booked = $1,
status = $2,
data = $3
WHERE id = (
SELECT
id
FROM
bookableresource_slots
WHERE
starttime = $4
AND booked IS NULL
LIMIT 1
-- SHOULD I USE "FOR UPDATE" HERE TO LOCK THE ROW?
)
RETURNING
id;

你为什么不把它存入一个交易呢?DBMS将为您执行并发控制。的例子:https://www.postgresql.org/docs/current/tutorial-transactions.html

BEGIN;
UPDATE accounts SET balance = balance - 100.00
WHERE name = 'Alice';
-- etc etc
COMMIT;

最新更新