子查询中是否需要 FOR UPDATE?

时间:2021-02-25 14:06:55

标签: sql postgresql postgresql-9.6

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

1 个答案:

答案 0 :(得分:0)

你为什么不把它放到一个交易中。 DBMS 将为您进行并发控制。 示例来自: https://www.postgresql.org/docs/current/tutorial-transactions.html

conda run
相关问题