DOC HOME SITE MAP MAN PAGES GNU INFO SEARCH PRINT BOOK
 

(mysql.info) innodb-locks-set

Info Catalog (mysql.info) innodb-consistent-read-example (mysql.info) innodb-transaction-model (mysql.info) innodb-implicit-command-or-rollback
 
 14.2.10.8 Locks Set by Different SQL Statements in `InnoDB'
 ...........................................................
 
 A locking read, an `UPDATE', or a `DELETE' generally set record locks
 on every index record that is scanned in the processing of the SQL
 statement. It does not matter if there are `WHERE' conditions in the
 statement that would exclude the row. `InnoDB' does not remember the
 exact `WHERE' condition, but only knows which index ranges were
 scanned. The record locks are normally next-key locks that also block
 inserts to the `gap' immediately before the record.
 
 If the locks to be set are exclusive, `InnoDB' always retrieves also
 the clustered index record and sets a lock on it.
 
 If you do not have indexes suitable for your statement and MySQL has to
 scan the whole table to process the statement, every row of the table
 becomes locked, which in turn blocks all inserts by other users to the
 table. It is important to create good indexes so that your queries do
 not unnecessarily need to scan many rows.
 
 `InnoDB' sets specific types of locks as follows:
 
    * `SELECT ... FROM' is a consistent read, reading a snapshot of the
      database and setting no locks unless the transaction isolation
      level is set to `SERIALIZABLE'. For `SERIALIZABLE' level, this
      sets shared next-key locks on the index records it encounters.
 
    * `SELECT ... FROM ... LOCK IN SHARE MODE' sets shared next-key
      locks on all index records the read encounters.
 
    * `SELECT ... FROM ... FOR UPDATE' sets exclusive next-key locks on
      all index records the read encounters.
 
    * `INSERT INTO ... VALUES (...)' sets an exclusive lock on the
      inserted row. Note that this lock is not a next-key lock and does
      not prevent other users from inserting to the gap before the
      inserted row. If a duplicate-key error occurs, a shared lock on
      the duplicate index record is set.
 
    * While initializing a previously specified `AUTO_INCREMENT' column
      on a table, `InnoDB' sets an exclusive lock on the end of the
      index associated with the `AUTO_INCREMENT' column. In accessing the
      auto-increment counter, `InnoDB' uses a specific table lock mode
      `AUTO-INC' where the lock lasts only to the end of the current SQL
      statement, not to the end of the entire transaction. Note that
      other clients cannot insert into the table while the `AUTO-INC'
      table lock is held; see  innodb-and-autocommit.
 
      `InnoDB' fetches the value of a previously initialized
      `AUTO_INCREMENT' column without setting any locks.
 
    * `INSERT INTO T SELECT ... FROM S WHERE ...' sets an exclusive
      (non-next-key) lock on each row inserted into `T'. `InnoDB' sets
      shared next-key locks locks on `S', unless
      `innodb_locks_unsafe_for_binlog' is enabled, in which case it does
      the search on `S' as a consistent read.  `InnoDB' has to set locks
      in the latter case: In roll-forward recovery from a backup, every
      SQL statement has to be executed in exactly the same way it was
      done originally.
 
    * `CREATE TABLE ... SELECT ...' performs the `SELECT' as a
      consistent read or with shared locks, as in the previous item.
 
    * `REPLACE' is done like an insert if there is no collision on a
      unique key. Otherwise, an exclusive next-key lock is placed on the
      row that has to be updated.
 
    * `UPDATE ... WHERE ...' sets an exclusive next-key lock on every
      record the search encounters.
 
    * `DELETE FROM ... WHERE ...' sets an exclusive next-key lock on
      every record the search encounters.
 
    * If a `FOREIGN KEY' constraint is defined on a table, any insert,
      update, or delete that requires the constraint condition to be
      checked sets shared record-level locks on the records that it
      looks at to check the constraint. `InnoDB' also sets these locks
      in the case where the constraint fails.
 
    * `LOCK TABLES' sets table locks, but it is the higher MySQL layer
      above the `InnoDB' layer that sets these locks. `InnoDB' is aware
      of table locks if `innodb_table_locks=1' (the default) and
      `AUTOCOMMIT=0', and the MySQL layer above `InnoDB' knows about
      row-level locks.  Otherwise, `InnoDB''s automatic deadlock
      detection cannot detect deadlocks where such table locks are
      involved. Also, because the higher MySQL layer does not know about
      row-level locks, it is possible to get a table lock on a table
      where another user currently has row-level locks.  However, this
      does not endanger transaction integrity, as discussed in 
      innodb-deadlock-detection.  See also  innodb-restrictions.
 
Info Catalog (mysql.info) innodb-consistent-read-example (mysql.info) innodb-transaction-model (mysql.info) innodb-implicit-command-or-rollback
automatically generated byinfo2html