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
oGLOBAL
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.