[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
SET ... TRANSACTION ISOLATION LEVEL ...
In terms of the SQL-92 transaction isolation levels,
the InnoDB
default is REPEATABLE READ
.
Starting from version 4.0.5, InnoDB
offers all 4 different
transaction isolation levels described by the SQL-92 standard.
You can set the default isolation level for all connections
in the [mysqld]
section of `my.cnf':
transaction-isolation = {READ-UNCOMMITTED | READ-COMMITTED | REPEATABLE-READ | SERIALIZABLE} |
A user can change the isolation level of a single session or
all new incoming connections with the SET TRANSACTION
statement. Its syntax is as follows:
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE} |
Note that there are no hyphens in level names in the SQL syntax.
The default behavior is to set the isolation level for the next (not
started) transaction. If you use the GLOBAL
keyword, the statement
sets the default transaction level globally for all new connections
created from that point on (but not existing connections).
You need the SUPER
privilege to do this. Using the SESSION
keyword sets the default transaction level for all future transactions
performed on the current connection. Any client is free to change the
session isolation level (even in the middle of a transaction), or the
isolation level for the next transaction.
In versions earlier than 3.23.50, SET TRANSACTION
had no effect
on InnoDB
tables. In versions < 4.0.5 only REPEATABLE READ
and SERIALIZABLE
were available.
You can query the global and session transaction isolation levels with:
SELECT @@global.tx_isolation; SELECT @@tx_isolation; |
In row level locking InnoDB
uses so-called next-key locking.
That means that besides index records, InnoDB
can also lock
the "gap" before an index record to block insertions by other users
immediately before the index record. A next-key lock means
a lock which locks an index record and the gap before it.
A gap lock means a lock which only locks a gap before some
index record.
A detailed description of each isolation level in InnoDB
:
READ UNCOMMITTED
This is also called
"dirty read": non-locking SELECT
statements are performed
so that we do not look at a possible earlier version of a record;
thus they are not 'consistent' reads under this isolation level;
otherwise this level works like READ COMMITTED
.
READ COMMITTED
Somewhat Oracle-like isolation level.
All SELECT ... FOR UPDATE
and
SELECT ... LOCK IN SHARE MODE
statements
only lock the index records, not the gaps before them, and
thus allow free inserting of new records next to locked
records.
UPDATE
and DELETE
which use
a unique index with a unique search condition,
only lock the index record found, not the gap before it.
But still in range type
UPDATE
and DELETE
, InnoDB
must set next-key or gap locks and block insertions
by other users to the
gaps covered by the range. This is necessary
since "phantom rows" have to be blocked for MySQL
replication and recovery to work.
Consistent reads behave as in
Oracle: each consistent read, even within the same
transaction, sets and reads its own fresh snapshot.
REPEATABLE READ
This is the default isolation level of
InnoDB
.
SELECT ... FOR UPDATE
, SELECT ... LOCK IN SHARE MODE
,
UPDATE
, and DELETE
which use
a unique index with a unique search condition,
only lock the index record found, not the gap before it.
Otherwise these operations employ next-key locking, locking
the index range scanned with next-key or gap locks, and
block new insertions by other users.
In consistent reads there is an important difference
from the previous isolation level: in this level
all consistent reads within the same transaction read the
same snapshot established by the first read. This convention
means that if you issue several plain SELECT
statements
within the same transaction, these SELECT
statements are
consistent also with respect to each other.
SERIALIZABLE
This level is like
the previous one, but
all plain SELECT
statements are implicitly converted to
SELECT ... LOCK IN SHARE MODE
.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |