RDS for MySQL es compatible con el control del tiempo de espera de bloqueo DDL. Esta función le permite usar un hint para controlar cuánto tiempo espera un hilo DDL por un bloqueo MDL, lo que evita el bloqueo de sesiones y la acumulación de conexiones provocadas por esperas prolongadas.
Descripción general
Introducción: En MySQL, el parámetro lock_wait_timeout controla el tiempo de espera del bloqueo MDL. Para controlar con precisión el tiempo de espera de una operación DDL específica, debe modificar este parámetro antes de ejecutarla. RDS for MySQL ofrece una forma más sencilla de controlar el tiempo de espera del bloqueo MDL en instrucciones DDL individuales: especifique el tiempo de espera directamente en la instrucción mediante los hints /*+ WAIT(n) */ y /*+ NO_WAIT() */.
Beneficios: Usar un hint ofrece mejor compatibilidad que introducir una sintaxis nueva. El hint se escribe en el binlog como un comentario. Las instancias secundarias o los servicios de suscripción que no admiten esta función ignoran automáticamente el hint y lo tratan como un comentario normal. Esto previene errores de análisis sintáctico de SQL e interrupciones en la replicación.
Aplicabilidad
Esta función solo está disponible para las instancias que cumplen con a continuación requisitos de versión. Si su instancia no cumple estos requisitos, puede update the minor engine version o upgrade the major database version.
MySQL 8.4
MySQL 8.0 con una versión secundaria del motor 20250531 o posterior
Se aplican a continuación limitaciones cuando utiliza esta función:
Solo se admiten las operaciones
CREATE,DROP,ALTER,RENAME,TRUNCATEyOPTIMIZE.El hint no surte efecto en los nodos secundarios ni en las instancias de solo lectura durante la replicación desde el nodo principal.
En el hint
/*+ WAIT(n) */, n especifica el tiempo de espera en segundos y debe estar dentro del rango [0, 31536000].
Sintaxis
Para las operaciones CREATE, DROP, ALTER, RENAME, TRUNCATE y OPTIMIZE, agregue el hint /*+ WAIT(n) */ o /*+ NO_WAIT() */ inmediatamente después de la palabra clave para controlar el tiempo de espera del bloqueo MDL. Ejemplos:
-- Create table t1 and set the MDL timeout to 10 seconds.
CREATE /*+ WAIT(10) */ TABLE t1(a INT);
-- Add a column to table t1 with no wait for the MDL lock.
ALTER /*+ NO_WAIT() */ TABLE t1 ADD COLUMN b INT;
-- Drop table t1 and set the MDL timeout to 1 second.
DROP /*+ WAIT(1) */ TABLE t1;
Ejemplo
Procedimiento de prueba
-
Abra una sesión, cree la tabla
t1y adquiera un bloqueo MDL S sobre ella.CREATE TABLE t1(a INT); LOCK TABLE t1 READ; -
En una segunda sesión, intente modificar y eliminar la tabla con los hints
/*+ WAIT(n) */y/*+ NO_WAIT() */, y observe los resultados.ALTER /*+ NO_WAIT() */ TABLE t1 ADD COLUMN b INT; DROP /*+ WAIT(1) */ TABLE t1;
Resultados de la prueba
Con los hints /*+ WAIT(n) */ y /*+ NO_WAIT() */, las operaciones DDL fallan de manera rápida y predecible si no se adquiere el bloqueo dentro del tiempo de espera especificado.
mysql> ALTER /*+ NO_WAIT() */ TABLE t1 ADD COLUMN b INT;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
mysql> DROP /*+ WAIT(1) */ TABLE t1;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction