【问题标题】:Postgres: order of `FOR UPDATE OF table` retrievalPostgres:“FOR UPDATE OF table”检索的顺序
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-27
    • 1970-01-01
    相关资源
    最近更新 更多