Skip to content
Snippets Groups Projects
  • Tom Lane's avatar
    bedb78d3
    Implement sharable row-level locks, and use them for foreign key references · bedb78d3
    Tom Lane authored
    to eliminate unnecessary deadlocks.  This commit adds SELECT ... FOR SHARE
    paralleling SELECT ... FOR UPDATE.  The implementation uses a new SLRU
    data structure (managed much like pg_subtrans) to represent multiple-
    transaction-ID sets.  When more than one transaction is holding a shared
    lock on a particular row, we create a MultiXactId representing that set
    of transactions and store its ID in the row's XMAX.  This scheme allows
    an effectively unlimited number of row locks, just as we did before,
    while not costing any extra overhead except when a shared lock actually
    has to be shared.   Still TODO: use the regular lock manager to control
    the grant order when multiple backends are waiting for a row lock.
    
    Alvaro Herrera and Tom Lane.
    bedb78d3
    History
    Implement sharable row-level locks, and use them for foreign key references
    Tom Lane authored
    to eliminate unnecessary deadlocks.  This commit adds SELECT ... FOR SHARE
    paralleling SELECT ... FOR UPDATE.  The implementation uses a new SLRU
    data structure (managed much like pg_subtrans) to represent multiple-
    transaction-ID sets.  When more than one transaction is holding a shared
    lock on a particular row, we create a MultiXactId representing that set
    of transactions and store its ID in the row's XMAX.  This scheme allows
    an effectively unlimited number of row locks, just as we did before,
    while not costing any extra overhead except when a shared lock actually
    has to be shared.   Still TODO: use the regular lock manager to control
    the grant order when multiple backends are waiting for a row lock.
    
    Alvaro Herrera and Tom Lane.
lock.sgml 8.98 KiB