• Heikki Linnakangas's avatar
    Fix bugs in Serializable Snapshot Isolation. · 47ad7912
    Heikki Linnakangas authored
    Change the way UPDATEs are handled. Instead of maintaining a chain of
    tuple-level locks in shared memory, copy any existing locks on the old
    tuple to the new tuple at UPDATE. Any existing page-level lock needs to
    be duplicated too, as a lock on the new tuple. That was neglected
    previously.
    
    Store xmin on tuple-level predicate locks, to distinguish a lock on an old
    already-recycled tuple from a new tuple at the same physical location.
    Failure to distinguish them caused loops in the tuple-lock chains, as
    reported by YAMAMOTO Takashi. Although we don't use the chain representation
    of UPDATEs anymore, it seems like a good idea to store the xmin to avoid
    some false positives if no other reason.
    
    CheckSingleTargetForConflictsIn now correctly handles the case where a lock
    that's being held is not reflected in the local lock table. That happens
    if another backend acquires a lock on our behalf due to an UPDATE or a page
    split.
    
    PredicateLockPageCombine now retains locks for the page that is being
    removed, rather than removing them. This prevents a potentially dangerous
    false-positive inconsistency where the local lock table believes that a lock
    is held, but it is actually not.
    
    Dan Ports and Kevin Grittner
    47ad7912
predicate_internals.h 16.5 KB