Postgres:“ FOR UPDATE OF table”检索的顺序

时间:2018-08-13 17:51:32

标签: postgresql transactions locking database-locking

我想知道在JOIN中依靠"relations": [ { "type": "AllInOne", "sentence": "…", "arguments": [ { "entities": [ { "“text": "””", "type": "entity1" } ] }, { "entities": [ { "“text": "””", "type": "entity2" } ] }, { "entities": [ { "“text": "””", "type": "\"entity..n”," } ] }, { "..." } ] } 时的数据一致性。我将尝试举一个简单的例子:

交易1完成:

FOR UPDATE OF <table>

事务2在执行以下操作时非常紧密:

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; [...] ?锁位于b.val的行上–在从a检索行之前,它是否等待该锁?

1 个答案:

答案 0 :(得分:0)

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