Dans MySQL, les tables avec un champ auto_increment couplé à des contraintes uniques présentent un comportement particulier lorsque les opérations d'insertion échouent en raison de valeurs uniques en double . Bien que l'insertion échoue comme prévu, la valeur auto_increment est néanmoins incrémentée, un phénomène déclenché par l'accès au compteur d'auto-incrémentation.
Au cœur de ce comportement se trouve la nature transactionnelle d'InnoDB. Pour garantir la simultanéité des insertions, InnoDB utilise un verrou AUTO-INC spécial au niveau de la table qui reste verrouillé jusqu'à la fin de l'instruction SQL en cours plutôt que jusqu'à la fin de la transaction.
Cela signifie que même si une insertion échoue en raison d'une valeur unique en double, le compteur d'auto-incrémentation est incrémenté car le LOCK est libéré à la fin de l'instruction. Les insertions suivantes récupéreront la valeur incrémentée, entraînant des écarts dans la séquence d'auto-incrémentation.
La décision d'InnoDB d'autoriser les écarts vise à améliorer la concurrence pour les insertions dans les tables avec des colonnes auto_increment. Cependant, cela soulève des inquiétudes quant à une corruption potentielle de la table si la colonne id à incrémentation automatique s'enroule autour de sa valeur maximale.
Pour atténuer ce risque, envisagez d'utiliser un type de données BIGINT pour la colonne id, qui offre un 8- capacité de stockage en octets et une probabilité considérablement réduite de problèmes de bouclage.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!