Descripción del bloqueo

Completado

Para evitar que los usuarios obtengan datos incorrectos devueltos por una instrucción SELECT, MySQL bloquea los objetos de base de datos. InnoDB usa el bloqueo de metadatos para administrar el acceso simultáneo y la coherencia de los datos. El bloqueo de metadatos afecta a los siguientes comandos:

  • CREATE o DELETE INDEX
  • MODIFY TABLE
  • DROP TABLE
  • Operaciones de mantenimiento de tablas, como OPTIMIZE TABLE y TABLE REPAIR.
  • LOCK TABLE <mytable> WRITE

El bloqueo de metadatos impide que las instrucciones del lenguaje de definición de datos (DDL) actúen en objetos afectados mientras una transacción está en curso.

Nota

Las instrucciones de DDL definen los objetos de base de datos. Son comandos como CREATE, ALTER, DROP, etc.

Para que el bloqueo de metadatos funcione sin problemas y sin afectar al rendimiento, MySQL debe tener la confirmación automática en ACTIVADO. Esto evita que las confirmaciones pendientes y los objetos bloqueados impidan que otros usuarios accedan a ellos. La confirmación automática está de forma predeterminada en ACTIVADO. Si es práctico, realice operaciones DLL cuando haya pocos usuarios conectados o ninguno.

InnoDB también usa bloqueos de fila compartidos y exclusivos. Un bloqueo compartido permite lecturas, y los bloqueos exclusivos son exclusivos de una transacción, lo que detiene otras transacciones que modifican la fila. InnoDB también bloqueará las tablas si es necesario.

Los bloqueos de rango se usan para bloquear índices y garantizar resultados coherentes de las instrucciones SELECT.

Los interbloqueos se producen cuando dos transacciones están esperando entre sí para liberar un bloqueo. InnoDB resuelve este hecho con el parámetro innodb_lock_wait_timeout. La consulta esperará el tiempo especificado y, a continuación, se detendrá.

En la tabla siguiente se describen los parámetros del servidor relacionados con los bloqueos. Estos parámetros también se pueden establecer en el nivel de sesión.

Parámetro de servidor Descripción Valor predeterminado
innodb_lock_wait_timeout El tiempo en segundos que una transacción espera para un bloqueo de fila. 50 segundos
lock_wait_timeout El tiempo en segundos para adquirir bloqueos de metadatos.