Maison > base de données > tutoriel mysql > Pourquoi l'auto-incrémentation de MySQL s'incrémente-t-elle même en cas d'insertions échouées avec des contraintes uniques ?

Pourquoi l'auto-incrémentation de MySQL s'incrémente-t-elle même en cas d'insertions échouées avec des contraintes uniques ?

Barbara Streisand
Libérer: 2024-11-25 12:16:15
original
169 Les gens l'ont consulté

Why Does MySQL's Autoincrement Increment Even on Failed Inserts with Unique Constraints?

Comportement de l'auto-incrémentation MySQL en cas d'échec des insertions

Question :

Pourquoi l'auto-incrémentation la valeur dans MySQL augmente malgré l'échec des insertions lorsqu'un champ unique existe-t-il ?

Explication :

InnoDB, le moteur par défaut de MySQL, fonctionne de manière transactionnelle. Par conséquent, lorsque plusieurs sessions tentent des insertions simultanées dans une table avec une colonne d'auto-incrémentation, certains scénarios peuvent survenir :

  • Si la session A insère un enregistrement puis revient en arrière, un écart peut se produire ou la session B, qui tenté d'insérer un enregistrement simultanément, peut être verrouillé jusqu'à la fin de la transaction de la session A.
  • Pour améliorer la concurrence pour les insertions dans de telles tables, InnoDB utilise un Verrouillage AUTO-INC au niveau de la table. Ce verrou est libéré à la fin de l'instruction SQL, et non de la transaction, permettant aux autres sessions d'accéder plus efficacement au compteur d'auto-incrémentation.

Conséquence :

Lorsqu'une insertion échoue en raison d'une violation de contrainte de champ unique, la valeur d'auto-incrémentation est toujours incrémentée car InnoDB maintient le compteur d'auto-incrémentation en mémoire tout au long de la durée de vie du serveur. opération. Lorsque le serveur redémarre, InnoDB réinitialise le compteur de chaque table lors de la première insertion dans cette table.

Atténuation :

Si le potentiel de retour à la ligne de la colonne ID est un problème , envisagez d'utiliser un type de données BIGINT (de 8 octets de long) pour fournir une plage de valeurs plus large.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal