问题描述
考虑以下更新。我认为命名已经足够清楚,不需要任何进一步的解释。要更新哪一行的标识发生在子查询中。这里有并发风险吗?另一个进程是否可以在子查询和外部查询的执行之间“潜入”并预订该行?如果是这样,我认为可以通过在子查询中执行 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
conda run