En los términos de los niveles de aislamiento de transacciones
SQL:1992, el nivel predeterminado en InnoDB
es REPEATABLE READ
. En MySQL 5.0,
InnoDB
ofrece los cuatro niveles de
aislamiento de transacciones descriptos por el estándar SQL. Se
puede establecer el nivel predeterminado de aislamiento por
todas las conexiones mediante el uso de la opción
--transaction-isolation
en la línea de
comandos o en ficheros de opciones. Por ejemplo, se puede
establecer la opción en la sección [mysqld]
de my.cnf
de este modo:
[mysqld] transaction-isolation = {READ-UNCOMMITTED | READ-COMMITTED | REPEATABLE-READ | SERIALIZABLE}
Un usuario puede cambiar el nivel de aislamiento de una sesión
individual o de todas las nuevas conexiones con la sentencia
SET TRANSACTION
. Su sintaxis es la siguiente:
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}
Nótese que se usan guiones en los nombres de niveles de la
opción --transaction-isolation
, pero no en
la sentencia SET TRANSACTION
.
El comportamiento predeterminado es establecer el nivel de
aislamiento a partir de la próxima transacción que se inicie.
Si se emplea la palabra clave GLOBAL
, la
sentencia establece el nivel predeterminado de la transacción
globalmente para todas las nuevas conexiones creadas a partir de
ese punto (pero no en las existentes). Se necesita el privilegio
SUPER
para hacer esto. Utilizando la palabra
clave SESSION
se establece el nivel de
transacción para todas las futuras transacciones ejecutadas en
la actual conexión.
Cualquier cliente es libre de cambiar el nivel de aislamiento de la sesión (incluso en medio de una transacción), o el nivel de aislamiento para la próxima transacción.
Los niveles de aislamiento de transacciones globales y de sesión pueden consultarse con estas sentencias:
SELECT @@global.tx_isolation; SELECT @@tx_isolation;
En el bloqueo a nivel de fila, InnoDB
emplea
bloqueo de clave siguiente (next-key). Esto significa que,
además de registros de índice, InnoDB
también puede bloquear el “vacío” que precede a
un registro de índice para bloquear inserciones de otros
usuarios inmediatamente antes del registro de índice. Un
bloqueo de clave siguiente hace referencia a bloquear un
registro de índice y la posición vacía antes de él. Bloquear
una posición vacía es establecer un bloqueo que actúa
solamente sobre el vacío anterior a un registro de índice.
A continuación una descripción detallada de cada nivel de
aislamiento en InnoDB
:
READ UNCOMMITTED
Las sentencias SELECT
son ejecutadas sin
realizar bloqueos, pero podría usarse una versión anterior
de un registro. Por lo tanto, las lecturas no son
consistentes al usar este nivel de aislamiento. Esto
también se denomina “lectura sucia” (dirty
read). En otro caso, este nivel de aislamiento funciona
igual que READ COMMITTED
.
READ COMMITTED
Similar en parte al mismo nivel de aislamiento de Oracle.
Todas las sentencias SELECT ... FOR
UPDATE
y SELECT ... LOCK IN SHARE
MODE
bloquean solamente los registros de índice,
no los espacios vacíos que los preceden, por lo tanto se
permite la libre inserción de nuevos registros junto a los
bloqueados. Las sentencias UPDATE
and
DELETE
que empleen un índice único con
una condición de búsqueda única bloquean solamente el
registro de índice hallado, no el espacio que lo precede.
En las sentencias UPDATE
y
DELETE
que actúan sobre rangos de
registros, InnoDB
debe bloquear los
espacios vacíos y bloquear las inserciones de otros
usuarios en los espacios vacíos que hay dentro del rango.
Esto es necesario debido a que las “filas
fantasma” deben ser bloqueadas para que funcionen la
replicación y recuperación en MySQL.
Las lecturas consistentes se comportan como en Oracle: Cada lectura consistente, incluso dentro de la misma transacción, establece y lee su propia captura tomada de la base de datos. Consulte Sección 15.10.4, “Lecturas consistentes que no bloquean”.
REPEATABLE READ
Este es el nivel de aislamiento predeterminado de
InnoDB
. Las sentencias SELECT
... FOR UPDATE
, SELECT ... LOCK IN SHARE
MODE
, UPDATE
, y
DELETE
que utilicen un índice único con
una condición de búsqueda única, bloquean solamente el
registro de índice hallado, no el espacio vacío que lo
precede. Con otras condiciones de búsqueda, estas
operaciones emplean bloqueo de clave siguiente (next-key),
bloqueando el rango de índice cubierto por la operación
incluyendo los espacios vacíos, y bloqueando las nuevas
inserciones por parte de otros usuarios.
En lecturas consistentes (consistent reads), hay una
importante diferencia con respecto al nivel de aislamiento
anterior: En este nivel, todas las lecturas consistentes
dentro de la misma transacción leen de la captura de la
base de datos tomada por la primer lectura. Esta práctica
significa que si se emiten varias sentencias
SELECT
dentro de la misma transacción,
éstas serán consistentes unas con otras. Consulte
Sección 15.10.4, “Lecturas consistentes que no bloquean”.
SERIALIZABLE
Este nivel es similar a REPEATABLE READ
,
pero todas las sentencias SELECT
son
convertidas implícitamente a SELECT ... LOCK IN
SHARE MODE
.
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.