0

我想知道依靠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

4

1 回答 1

0

对这个问题的评论证实了我的怀疑——锁不会延迟从其他表中检索其他行。这是一个非常具体的场景,但我欢迎提供信息丰富的答案,展示实现此目的的简单方法。我最终将第二个 SELECT 分成两个查询——第一个 SELECT 获得锁,然后第二个 SELECT 检索b行,确保它们被更新。

于 2018-08-15T17:26:06.817 回答