【问题标题】:Should I use FOR UPDATE in SELECT subquery here DELETE FROM table WHERE id = any(array(SELECT id FROM table WHERE ... LIMIT 100))我应该在此处的 SELECT 子查询中使用 FOR UPDATE DELETE FROM table WHERE id = any(array(SELECT id FROM table WHERE ... LIMIT 100))
【发布时间】:2019-12-20 11:07:55
【问题描述】:

我知道如果我使用 ctid,我应该在子查询中使用 FOR UPDATE,因为当我的事务尝试删除它时,另一个事务可以更新行。因此,该行不会被删除。正确的方法:

DELETE FROM table WHERE ctid = any(array(
    SELECT ctid
    FROM table
    WHERE ...
    LIMIT 100
    FOR UPDATE));

如果我以同样的方式使用主键,我是否需要在 SELECT 子查询中使用 FOR UPDATE?如果没有,为什么不呢?

DELETE FROM table WHERE id = any(array(
    SELECT id
    FROM table
    WHERE ...
    LIMIT 100
    FOR UPDATE));

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    主键也可能发生同样的情况,尽管我希望它发生的频率较低(主键不应更改)。

    但是您需要 FOR UPDATE 不仅因为可以修改该行:没有它,子查询还将看到被并发语句删除的行,并且当您尝试删除它们时将证明这些行不存在.

    最后,在可以使用索引的子查询中拥有ORDER BY 将是一件好事。然后所有此类查询将尝试以相同的顺序锁定行,从而减少死锁的可能性。

    【讨论】:

      猜你喜欢
      • 2011-04-06
      • 2017-09-27
      • 1970-01-01
      • 1970-01-01
      • 2014-01-20
      • 1970-01-01
      • 2019-06-26
      • 1970-01-01
      • 2012-08-08
      相关资源
      最近更新 更多