• Alvaro Herrera's avatar
    Don't ignore tuple locks propagated by our updates · 11ac4c73
    Alvaro Herrera authored
    If a tuple was locked by transaction A, and transaction B updated it,
    the new version of the tuple created by B would be locked by A, yet
    visible only to B; due to an oversight in HeapTupleSatisfiesUpdate, the
    lock held by A wouldn't get checked if transaction B later deleted (or
    key-updated) the new version of the tuple.  This might cause referential
    integrity checks to give false positives (that is, allow deletes that
    should have been rejected).
    
    This is an easy oversight to have made, because prior to improved tuple
    locks in commit 0ac5ad51 it wasn't possible to have tuples created by
    our own transaction that were also locked by remote transactions, and so
    locks weren't even considered in that code path.
    
    It is recommended that foreign keys be rechecked manually in bulk after
    installing this update, in case some referenced rows are missing with
    some referencing row remaining.
    
    Per bug reported by Daniel Wood in
    CAPweHKe5QQ1747X2c0tA=5zf4YnS2xcvGf13Opd-1Mq24rF1cQ@mail.gmail.com
    11ac4c73
propagate-lock-delete.out 3.79 KB