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.

