如何解决子查询中是否需要 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
conda run
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。