使用 SELECT FOR UPDATE 和 JOIN 的行锁定顺序和死锁风险

问题描述 投票:0回答:0

考虑以下交易:

BEGIN;

SELECT *
FROM A
JOIN B ON A.id = B.a_id
WHERE A.id = 123
ORDER BY A.id, B.id
FOR UPDATE;

-- more ops...

COMMIT;

我使用

ORDER BY
子句只是为了确保以一致的方式锁定行,这样,如果多个并发连接执行同一事务,就不会发生死锁。

我的问题是:

  1. 我是否以正确的方式使用了
    ORDER BY
    子句(考虑到我正在做一个
    JOIN
    )?
  2. 行的锁定顺序是什么? 我正在尝试锁定表 A 中的所有行(按 ID 顺序),然后锁定表 B 中的所有行(再次按 ID 顺序) 但我想这不是正确的方法。

几个月前我问过一个similar question,但是没有使用

JOIN
子句。

sql postgresql deadlock select-for-update
© www.soinside.com 2019 - 2024. All rights reserved.