Tous les produits
Search
Centre de documentation

ApsaraDB RDS:Contrôle du délai d'attente des verrous DDL

Dernière mise à jour :Oct 12, 2026

RDS for MySQL prend en charge le contrôle du délai d'attente des verrous DDL. Cette fonctionnalité vous permet d'utiliser un indice (hint) pour définir la durée pendant laquelle un thread DDL attend un verrou MDL, évitant ainsi le blocage des sessions et l'accumulation de connexions provoqués par des attentes de verrou prolongées.

Présentation

Introduction : Dans MySQL, le paramètre lock_wait_timeout gère le délai d'expiration des verrous MDL. Pour contrôler avec précision le temps d'attente d'une opération DDL spécifique, vous devez modifier ce paramètre avant l'exécution. RDS for MySQL propose une méthode plus simple pour gérer le délai d'attente des verrous MDL pour chaque instruction DDL : vous pouvez spécifier directement le délai d'expiration dans l'instruction à l'aide des indices /*+ WAIT(n) */ et /*+ NO_WAIT() */.

Avantages : L'utilisation d'un indice offre une meilleure compatibilité que l'introduction d'une nouvelle syntaxe. L'indice est écrit dans le binlog sous forme de commentaire. Les instances en aval ou les services d'abonnement qui ne prennent pas en charge cette fonctionnalité ignoreront automatiquement l'indice, le traitant comme un commentaire standard. Cela prévient les erreurs d'analyse SQL et les interruptions de réplication.

Applicabilité

Cette fonctionnalité est disponible uniquement pour les instances qui satisfont aux exigences de version suivantes. Si votre instance ne remplit pas ces conditions, vous pouvez mettre à jour la version mineure du moteur ou mettre à niveau la version majeure de la base de données.

  • MySQL 8.4

  • MySQL 8.0 avec une version mineure du moteur égale ou supérieure à 20250531

Les limitations suivantes s'appliquent lors de l'utilisation de cette fonctionnalité :

  • Seules les opérations CREATE, DROP, ALTER, RENAME, TRUNCATE et OPTIMIZE sont prises en charge.

  • L'indice n'a aucun effet sur les nœuds secondaires ou les instances en lecture seule lors de la réplication depuis le nœud principal.

  • Dans l'indice /*+ WAIT(n) */, n représente le temps d'attente en secondes et doit se situer dans la plage [0, 31536000].

Syntaxe

Pour les opérations CREATE, DROP, ALTER, RENAME, TRUNCATE et OPTIMIZE, ajoutez l'indice /*+ WAIT(n) */ ou /*+ NO_WAIT() */ immédiatement après le mot-clé afin de contrôler le délai d'attente du verrou MDL. Exemples :

-- 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;

Exemple

Procédure de test

  1. Ouvrez une session, créez la table t1 et acquérez un verrou MDL S sur la table.

    CREATE TABLE t1(a INT);
    LOCK TABLE t1 READ;
  2. Dans une deuxième session, tentez de modifier et de supprimer la table en utilisant les indices /*+ WAIT(n) */ et /*+ NO_WAIT() */, puis observez les résultats.

    ALTER /*+ NO_WAIT() */ TABLE t1 ADD COLUMN b INT;
    DROP /*+ WAIT(1) */ TABLE t1;

Résultats du test

Avec les indices /*+ WAIT(n) */ et /*+ NO_WAIT() */, les opérations DDL échouent rapidement et de manière prévisible si un verrou n'est pas acquis dans le délai spécifié.

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