Sintaxis

SET [GLOBAL | SESSION] TRANSACTION
    transaction_property [, transaction_property] ...

transaction_property:
    ISOLATION LEVEL level
  | READ WRITE
  | READ ONLY

level:
     REPEATABLE READ
   | READ COMMITTED
   | READ UNCOMMITTED
   | SERIALIZABLE

Descripción

Esta declaración establece el nivel de aislamiento de la transacción o el modo de acceso a la transacción de forma global, para la sesión actual o para la siguiente transacción:

  • Con el GLOBAL palabra clave, la declaración establece el nivel de transacción predeterminado globalmente para todas las sesiones posteriores. Las sesiones existentes no se ven afectadas.
  • Con el SESSION palabra clave, la declaración establece el nivel de transacción predeterminado para todas las transacciones posteriores realizadas dentro de la sesión actual.
  • Sin ningún SESSION o GLOBAL palabra clave, la declaración establece el nivel de aislamiento para la siguiente transacción (no iniciada) realizada dentro de la sesión actual.

Un cambio en el nivel de aislamiento predeterminado global requiere SUPER privilegio. Cualquier sesión es libre de cambiar su nivel de aislamiento de sesión (incluso en medio de una transacción) o el nivel de aislamiento para su próxima transacción.

Nivel de aislamiento

Para establecer el nivel de aislamiento predeterminado global al iniciar el servidor, utilice el --transaction-isolation=level opción en la línea de comando o en un archivo de opciones. Los valores de nivel para esta opción usan guiones en lugar de espacios, por lo que los valores permitidos son READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, o SERIALIZABLE. Por ejemplo, para establecer el nivel de aislamiento predeterminado en REPEATABLE READ, use estas líneas en el [mysqld] sección de un archivo de opciones:

[mysqld]
transaction-isolation = REPEATABLE-READ

Para determinar los niveles de aislamiento de transacciones globales y de sesión en tiempo de ejecución, verifique el valor del tx_isolation variable de sistema:

SELECT @@GLOBAL.tx_isolation, @@tx_isolation;

InnoDB admite cada uno de los niveles de aislamiento de traducción descritos aquí utilizando diferentes estrategias de bloqueo. El nivel predeterminado es REPEATABLE READ. Para obtener información adicional sobre los bloqueos de nivel de registro de InnoDB y cómo los usa para ejecutar varios tipos de declaraciones, consulte Modos de bloqueo de XtraDB / InnoDB y http://dev.mysql.com/doc/refman/en/innodb-locks-set.html.

Niveles de aislamiento

Las siguientes secciones describen cómo MariaDB admite los diferentes niveles de transacción.

LEER SIN COMPROMISO

SELECT Las sentencias se ejecutan sin bloqueo, pero se puede utilizar una posible versión anterior de una fila. Por lo tanto, al usar este nivel de aislamiento, tales lecturas no son consistentes. Esto también se denomina “lectura sucia”. De lo contrario, este nivel de aislamiento funciona como READ COMMITTED.

LEER COMPROMETIDO

Un nivel de aislamiento algo parecido a Oracle con respecto a las lecturas consistentes (sin bloqueo): cada lectura consistente, incluso dentro de la misma transacción, establece y lee su propia instantánea nueva. Ver http://dev.mysql.com/doc/refman/en/innodb-consistent-read.html.

Para bloquear lee (SELECT con FOR UPDATE o LOCK IN SHARE MODE), InnoDB bloquea solo los registros de índice, no los espacios antes de ellos, y por lo tanto permite la inserción gratuita de nuevos registros junto a los registros bloqueados. Para UPDATE y DELETE declaraciones, el bloqueo depende de si la declaración utiliza un índice único con una condición de búsqueda única (como WHERE id = 100), o una condición de búsqueda de tipo rango (como WHERE id > 100). Para un índice único con una condición de búsqueda única, InnoDB bloquea solo el registro de índice encontrado, no el espacio anterior. Para búsquedas de tipo de rango, InnoDB bloquea el rango de índice escaneado, utilizando bloqueos de espacio o bloqueos de siguiente clave (espacio más registro de índice) para bloquear inserciones de otras sesiones en los espacios cubiertos por el rango. Esto es necesario porque las “filas fantasma” deben estar bloqueadas para que funcione la replicación y recuperación de MySQL.

Nota: Desde MariaDB 5.1, si el READ COMMITTED se utiliza el nivel de aislamiento o el innodb_locks_unsafe_for_binlog La variable del sistema está habilitada, no hay bloqueo de espacios InnoDB, excepto para la verificación de restricciones de clave externa y la verificación de clave duplicada. Además, los bloqueos de registros para filas que no coinciden se liberan después de que MariaDB ha evaluado el WHERE condición. A partir de MariaDB / MySQL 5.1, si usa READ COMMITTED o habilitar innodb_locks_unsafe_for_binlog, debe utilizar el registro binario basado en filas.

LECTURA REPETIBLE

Este es el nivel de aislamiento predeterminado para InnoDB. Para lecturas consistentes, hay una diferencia importante con la READ COMMITTED nivel de aislamiento: todas las lecturas coherentes dentro de la misma transacción leen la instantánea establecida por la primera lectura. Esta convención significa que si emite varios mensajes simples (sin bloqueo) SELECT declaraciones dentro de la misma transacción, estos SELECT las declaraciones son coherentes también entre sí. Ver http://dev.mysql.com/doc/refman/en/innodb-consistent-read.html.

Para las lecturas de bloqueo (SELECT con FOR UPDATE o LOCK IN SHARE MODE), UPDATE y DELETE sentencias, el bloqueo depende de si la sentencia utiliza un índice único con una condición de búsqueda única o una condición de búsqueda de tipo rango. Para un índice único con una condición de búsqueda única, InnoDB bloquea solo el registro de índice encontrado, no el espacio anterior. Para otras condiciones de búsqueda, InnoDB bloquea el rango de índice escaneado, utilizando bloqueos de espacio o bloqueos de siguiente clave (espacio más registro de índice) para bloquear inserciones de otras sesiones en los espacios cubiertos por el rango.

Este es el nivel de aislamiento mínimo para transacciones XA no distribuidas.

SERIALIZABLE

Este nivel es como REPEATABLE READ, pero InnoDB convierte implícitamente todas las declaraciones SELECT simples a SELECT ... LOCK IN SHARE MODE si autocommit está desactivado. Si la confirmación automática está habilitada, SELECT es su propia transacción. Por lo tanto, se sabe que es de solo lectura y se puede serializar si se realiza como una lectura consistente (sin bloqueo) y no es necesario bloquear para otras transacciones. (Esto significa que para forzar que un SELECT simple se bloquee si otras transacciones han modificado las filas seleccionadas, debe deshabilitar la confirmación automática).

Las transacciones XA distribuidas siempre deben utilizar este nivel de aislamiento.

Modo de acceso

Estas cláusulas aparecieron en MariaDB 10.0.

El modo de acceso especifica si la transacción puede escribir datos o no. Por defecto, las transacciones están en READ WRITE modo (ver el tx_read_only variable de sistema). READ ONLY El modo permite que el motor de almacenamiento aplique optimizaciones que no se pueden utilizar para transacciones que escriben datos. La única excepción a esta regla es que las transacciones de solo lectura pueden realizar declaraciones DDL en tablas temporales.

No está permitido especificar ambos READ WRITE y READ ONLY en la misma declaración.

READ WRITE y READ ONLY también se puede especificar en el START TRANSACTION declaración, en cuyo caso el modo especificado sólo es válido para una transacción.

Ejemplos de

SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE;

Intentar establecer el nivel de aislamiento dentro de una transacción existente sin especificar GLOBAL o SESSION.

START TRANSACTION;

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
ERROR 1568 (25001): Transaction characteristics can't be changed while a transaction is in progress

El contenido reproducido en este sitio es propiedad de sus respectivos dueños, y MariaDB no revisa este contenido con anticipación. Los puntos de vista, la información y las opiniones expresadas por este contenido no representan necesariamente las de MariaDB o de cualquier otra parte.