我想知道依靠FOR UPDATE OF <table>
JOIN 时的数据一致性。我将尝试做一个简单的例子:
事务 1 执行:
BEGIN;
SELECT 1 FROM a WHERE a.id = 5 FOR UPDATE;
UPDATE b SET val = 'other' WHERE b.a_id = 5;
COMMIT;
事务 2 在以下情况下非常密切地执行此操作:
BEGIN;
SELECT b.val FROM a, b WHERE a.id = 5 AND b.a_id = 5 FOR UPDATE OF a;
[...]
事务 2 是否有可能获得锁,但仍然过时b.val
?锁在来自的行上a
——它是否在从 检索行之前等待该锁b
?