![Why Doesn't MySQL's AUTO_INCREMENT Reset After a Rollback?](https://img.php.cn/upload/article/000/000/000/173485627359482.jpg)
Pourquoi MySQL AUTO_INCREMENT n'est pas affecté par les restaurations
Le champ AUTO_INCREMENT de MySQL conserve des valeurs uniques quel que soit l'état de la transaction. Ce comportement découle du scénario suivant :
Scénario :
- Le premier programme insère un enregistrement dans la table FOO, générant la valeur 557 pour son primaire auto-incrémenté clé.
- Le programme deux insère un enregistrement dans la table FOO, récupérant la valeur 558.
- Le programme 2 insère la valeur 558 dans la table BAR en tant que clé étrangère.
- Le programme 2 valide.
- Le programme 1 revient en arrière.
Problème :
Récupérer le La valeur 557 après une restauration crée plusieurs problèmes non résolus :
- La décrémentation des valeurs de clé primaire dans FOO affecterait d'autres enregistrements avec des valeurs plus élevées.
- La modification de BAR nécessiterait de supprimer la clé étrangère, ce qui pourrait impacter d'autres données.
- Effacer le rapport imprimé du programme trois est pratiquement impossible.
Conséquences :
Pour cette raison, les numéros de séquence d'Oracle fonctionnent également indépendamment des transactions.
Solution de contournement :
Si le maintien des valeurs d'incrémentation automatique sans interruption est crucial, les restaurations transactionnelles ne peuvent pas être utilisées. Au lieu de cela, un indicateur de statut peut être ajouté aux enregistrements :
- Lors de l'insertion initiale, définissez le statut sur "Incomplet".
- Pendant une transaction, mettez à jour le statut sur "Terminé" lorsque les opérations réussissent.
- Validez la transaction pour marquer l'enregistrement comme étant actif.
- Si la transaction est annulée, l'enregistrement incomplet reste pendant à des fins d'audit.
Cette solution présente ses propres défis mais offre un moyen de conserver les pistes d'audit tout en évitant les écarts d'auto-incrémentation.
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!
Déclaration: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