【发布时间】:2018-08-13 17:51:32
【问题描述】:
我想知道在 JOIN 中依赖 FOR UPDATE OF <table> 时的数据一致性。我试着做一个简单的例子:
事务 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 检索行之前等待该锁?
【问题讨论】:
-
因为表
b的第二个事务没有锁,是的,你有可能会过时b.val。 -
是的,但前提是事务 1 尚未提交。
标签: postgresql transactions locking database-locking