The world's most popular open source database
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.

