Spec-Zone .ru
спецификации, руководства, описания, API
|
To implement a large-scale, busy, or highly reliable database application, to port substantial code from a different database system, or to push MySQL performance to the limits of the laws of physics, you must understand the notions of transactions and locking as they relate to the InnoDB storage engine.
In the InnoDB
transaction model, the goal is to combine the best properties of a
multi-versioning database with traditional two-phase locking. InnoDB
does locking
on the row level and runs queries as nonlocking consistent reads by default, in the style of Oracle. The lock
information in InnoDB
is stored so space-efficiently that lock escalation is not
needed: Typically, several users are permitted to lock every row in InnoDB
tables,
or any random subset of the rows, without causing InnoDB
memory exhaustion.
In InnoDB
, all user activity occurs inside a transaction. If autocommit mode is
enabled, each SQL statement forms a single transaction on its own. By default, MySQL starts the session for each
new connection with autocommit enabled, so MySQL does a commit after each SQL statement if that statement did
not return an error. If a statement returns an error, the commit or rollback behavior depends on the error. See
Section
14.2.3.14, "InnoDB
Error Handling".
A session that has autocommit enabled can perform a multiple-statement transaction by starting it with an
explicit START
TRANSACTION
or BEGIN
statement and ending it with a COMMIT
or ROLLBACK
statement. See Section
13.3.1, "START TRANSACTION
, COMMIT
, and ROLLBACK
Syntax".
If autocommit mode is disabled within a session with SET autocommit = 0
, the
session always has a transaction open. A COMMIT
or ROLLBACK
statement ends the current transaction and a new one starts.
A COMMIT
means that the changes made in the current transaction are made permanent and become visible to other sessions.
A ROLLBACK
statement, on the other hand, cancels all modifications made by the current transaction. Both COMMIT
and ROLLBACK
release all InnoDB
locks that were set
during the current transaction.
In terms of the SQL:1992 transaction isolation levels, the default InnoDB
level is REPEATABLE READ
. InnoDB
offers all four transaction
isolation levels described by the SQL standard: READ UNCOMMITTED
, READ COMMITTED
, REPEATABLE READ
, and SERIALIZABLE
.
A user can change the isolation level for a single session or for all subsequent connections with the SET TRANSACTION
statement. To set the server's default isolation level for all
connections, use the --transaction-isolation
option on the command line or in an option file. For
detailed information about isolation levels and level-setting syntax, see Section
13.3.6, "SET TRANSACTION
Syntax".
In row-level locking,
InnoDB
normally uses next-key locking. That means that besides index records, InnoDB
can also lock the gap preceding an index record to
block insertions by other sessions where the indexed values would be inserted in that gap within the tree data
structure. A next-key lock refers to a lock that locks an index record and the gap before it. A gap lock refers
to a lock that locks only the gap before some index record.
For more information about row-level locking, and the circumstances under which gap locking is disabled, see Section 14.2.3.5, "InnoDB
Record, Gap, and Next-Key Locks".