DOC HOME SITE MAP MAN PAGES GNU INFO SEARCH PRINT BOOK
 

(mysql.info) innodb-next-key-locking

Info Catalog (mysql.info) innodb-locking-reads (mysql.info) innodb-transaction-model (mysql.info) innodb-consistent-read-example
 
 14.2.10.6 Next-Key Locking: Avoiding the Phantom Problem
 ........................................................
 
 In row-level locking, `InnoDB' uses an algorithm called _next-key
 locking_.  `InnoDB' performs the row-level locking in such a way that
 when it searches or scans an index of a table, it sets shared or
 exclusive locks on the index records it encounters. Thus, the row-level
 locks are actually index record locks.
 
 The locks `InnoDB' sets on index records also affect the `gap' before
 that index record. If a user has a shared or exclusive lock on record
 `R' in an index, another user cannot insert a new index record
 immediately before `R' in the index order. This locking of gaps is done
 to prevent the so-called `phantom problem.' Suppose that you want to
 read and lock all children from the `child' table having an identifier
 value greater than 100, with the intention of updating some column in
 the selected rows later:
 
      SELECT * FROM child WHERE id > 100 FOR UPDATE;
 
 Suppose that there is an index on the `id' column. The query scans that
 index starting from the first record where `id' is bigger than 100. If
 the locks set on the index records would not lock out inserts made in
 the gaps, a new row might meanwhile be inserted to the table.  If you
 execute the same `SELECT' within the same transaction, you would see a
 new row in the result set returned by the query. This is contrary to
 the isolation principle of transactions: A transaction should be able
 to run so that the data it has read does not change during the
 transaction. If we regard a set of rows as a data item, the new
 `phantom' child would violate this isolation principle.
 
 When `InnoDB' scans an index, it can also lock the gap after the last
 record in the index. Just that happens in the previous example: The
 locks set by `InnoDB' prevent any insert to the table where `id' would
 be bigger than 100.
 
 You can use next-key locking to implement a uniqueness check in your
 application: If you read your data in share mode and do not see a
 duplicate for a row you are going to insert, then you can safely insert
 your row and know that the next-key lock set on the successor of your
 row during the read prevents anyone meanwhile inserting a duplicate for
 your row. Thus, the next-key locking allows you to `lock' the
 non-existence of something in your table.
 
Info Catalog (mysql.info) innodb-locking-reads (mysql.info) innodb-transaction-model (mysql.info) innodb-consistent-read-example
automatically generated byinfo2html