es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Utiliza InnoDB bloqueos por fila cuando se utiliza UPDATE sin una cláusula WHERE?

Tengo una pregunta sobre las bloqueos en las tablas de InnoDB. Si entiendo correctamente la documentación, InnoDB utiliza bloqueos a nivel de FILA al realizar una declaración UPDATE.

Tengo una tabla como esta:

CREATE TABLE tabla_1 (
id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
info TEXT NULL,
desactivado tinyint(4) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;

Debido al tamaño de la tabla, esta declaración:

UPDATE tbl_name SET desactivado = 1

puede tardar hasta 60 segundos.

Durante ese tiempo, ocurre que otros procesos quieren INSERTAR otra fila en la tabla_1.
Esos procesos deben esperar a que la declaración UPDATE se complete, ya que la tabla utiliza el motor MyISAM que bloquea toda la tabla.

Ahora, para una solución, imagino que solo tengo que cambiar el motor de la base de datos a InnoDB para habilitar bloqueos a nivel de FILA en lugar de bloqueos de tabla.

Mi pregunta ahora es: ¿tengo que especificar una cláusula WHERE en la declaración UPDATE para forzar a InnoDB a usar bloqueos a nivel de fila? ¿De esta manera?:

UPDATE tbl_name SET desactivado = 1 WHERE desactivado IS NULL

¿O InnoDB maneja la actualización a nivel de FILA independientemente de la existencia de una cláusula WHERE?
Además, debido a que la tabla tiene una columna auto_increment, ¿cambia la forma en que InnoDB maneja los bloqueos?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Como experto en IT especializado en MySQL y bloqueo de bases de datos, puedo responder a esta pregunta con certeza.

    Es correcto que InnoDB utiliza bloqueos a nivel de fila al realizar una declaración UPDATE. Por defecto, InnoDB bloqueará las filas que necesita actualizar para evitar que otras transacciones las modifiquen simultáneamente.

    Cambiar el motor a InnoDB permitirá que otros procesos inserten filas en tabla_1 sin ser bloqueados por la actualización. Sin embargo, ten en cuenta que InnoDB aún puede necesitar bloquear brevemente las filas actualizadas para realizar la actualización.

    En cuanto a tu pregunta sobre si necesitas especificar una cláusula WHERE en la declaración UPDATE para forzar a InnoDB a utilizar bloqueos a nivel de fila, no es necesario. InnoDB siempre utiliza bloqueos a nivel de fila para las actualizaciones, independientemente de la existencia de una cláusula WHERE.

    Las columnas Auto_increment no afectan cómo InnoDB maneja los bloqueos. Los bloqueos se tomarán en las filas que se están actualizando, independientemente de los valores de su clave primaria.

    En resumen, cambiar el motor a InnoDB debería ayudar a reducir la contención para tu tabla_1. InnoDB utilizará bloqueos a nivel de fila de forma predeterminada para las actualizaciones, y no necesitas agregar una cláusula WHERE para forzar el bloqueo a nivel de fila. Las columnas Auto_increment no afectan cómo InnoDB maneja los bloqueos.

Comments are closed.