Transaction isolation level for innodb

MySQL es un excelente motor de base de datos e InnoDB la tecnología de almacenamiento de datos perfecta para completar la tupla. Antes de aparecer InnoDB existía MyISAM, el cual era menos robusto y seguro, de ahí que desde la versión 5.5 sea InnoDB el método de almacenamiento por defecto.
Una de las ventajas que presenta InnoDB es el nivel de aislamiento que tiene una transacción respecto de otra. En la actualidad existen 4 métodos disponibles con los que trabajar, lo cuales vamos a ver a continuación y ver cual es mejor en cada caso.
  • READ UNCOMMITTED
    Las sentencias SELECT son realizadas directamente sin ningún tipo de bloqueo en los datos. Este método puede dar un tipo de información antigua en caso de que otro valor se esté a escribir.
    Este nivel de transacción es muy útil en caso de necesitar velocidad de lectura, pero sin la necesidad de tener disponible el último valor en todos los casos.
    A esto se lo conoce como "lectura sucia".
  • READ COMMITTED
    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 y 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 tienen un comportamiento muy similar al de Oracle: Cada lectura establece y lee su propia captura tomada de la base de datos.
  • REPEATABLE READ
    Este es el nivel de aislamiento predeterminado en 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 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 y por lo tanto éstas serán consistentes unas con otras.
  • SERIALIZABLE
    Este nivel es similar a REPEATABLE READ, pero todas las sentencias SELECT son convertidas implícitamente a SELECT ... LOCK IN SHARE MODE.
Por defecto, como ya se comentó, el nivel elegido por InnoDB es REPEATABLE READ, ya que ofrece una mejor garantía de consistencia de los datos a mejor carga, pero este nivel se puede cambiar a nivel global o de sesión.
En caso de que nos interese cambiar a nivel global lo mejor es realizarlo desde el fichero de configuración, my.cnf,
[mysqld]
 transaction-isolation = READ-UNCOMMITTED
Y en caso de que deseemos cambiar sólo para una sesión, lo más fácil es actuar sobre la variable que lo controla,
mysql> SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

Más info en la web oficial: innodb-transaction-isolation.html


No hay comentarios :

Publicar un comentario

Formulario de contacto

Nombre

Correo electrónico *

Mensaje *

Últimos comentarios