IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Décisions SGBD Discussion :

Théorie: Identifiants auto-incrémentés


Sujet :

Décisions SGBD

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Août 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Théorie: Identifiants auto-incrémentés
    Bonjour à tous!

    Je viens avec une question relativement simple. Cependant, je n'ai pas trouvé de réponse après une longue matinée de recherche...peut être allez vous pouvoir m'aider.

    Imaginons que j'aie une table client avec deux champs

    client_id (numéro auto-incrémenté)
    client_nom (chaine de caractères)

    Deux utilisateurs créent un enregistrement dans cette table EN MEME TEMPS.
    La requête est du genre
    insert into client (client_nom) values (nomclient)

    L'identifiant du client est généré automatiquement. La question est de savoir quand exactement est-il créé?

    A- au moment de l'INSERT: auquel cas l'identifiant sera le même dans les deux requêtes.
    B- au moment du COMMIT: auquel cas on ne doit pas se soucier des éventuels doublons.
    C- "Rien de tout ça. T'es vraiment une chèvre en BDD! Casse-toi!!"

    Cela dépend-il des SGBD?

    Comment gérer les éventuels conflits (accès concurrentiels)?

    Voilà.. J'espère avoir été clair.

    Merci d'avance pour vos réponses!

  2. #2
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Bonjour, et bienvenue sur le forum,

    La lecture de cette article te donnera sûrement des éléments de réponses : Clefs auto incrémentées

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 102
    Points : 28 399
    Points
    28 399
    Par défaut
    L'affectation de l'identifiant est effectuée au moment de l'INSERT.
    Même si la transaction n'a pas encore été validée (COMMIT), le compteur de l'identifiant pour la table est incrémenté ; ce qui fait qu'en cas de ROLLBACK de la transaction il y a des trous dans la séquence des identifiants.
    Il n'y a pas de risque d'affecter deux fois un identifiant, parce que la notion de EN MEME TEMPS ne s'applique pas : il y aura quand même séquence des opérations.

  4. #4
    Nouveau Candidat au Club
    Inscrit en
    Août 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par al1_24
    Il n'y a pas de risque d'affecter deux fois un identifiant, parce que la notion de EN MEME TEMPS ne s'applique pas : il y aura quand même séquence des opérations.
    Ca contredit l'article précédemment cité...

    Ca nous renvoie à la question: "cela dépend-il des SGBD?".

    J'ai en effet le souvenir d'avoir créé trois enregistrements dans une nouvelle table, les avoir supprimés et avoir créé un nouvel enregistrement (alors seul dans la table) avec l'identifiant 4. C'est la preuve que, sur ce SGBD du moins, un identifiant est unique et n'est pas réattribué (jamais essayé la réindexation).

  5. #5
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Citation Envoyé par blapointe
    Ca contredit l'article précédemment cité...
    Je ne crois pas, pourquoi ?

    Citation Envoyé par blapointe
    Ca nous renvoie à la question: "cela dépend-il des SGBD?".
    Non : le mécanisme d'attribution de la prochaine clé (séquence ou champ auto) est géré par le serveur de données, dès qu'un programme y fait appel, toute tentative suivante d'appel doit attendre que la précédente ait aboutie : impossible donc d'avoir un doublon à ce niveau.

    Citation Envoyé par blapointe
    J'ai en effet le souvenir d'avoir créé trois enregistrements dans une nouvelle table, les avoir supprimés et avoir créé un nouvel enregistrement (alors seul dans la table) avec l'identifiant 4. C'est la preuve que, sur ce SGBD du moins, un identifiant est unique et n'est pas réattribué (jamais essayé la réindexation).
    C'est normal, le mécanisme pré-cité ne tient pas absoluement pas compte des suppressions, et ne gère donc pas les "trous" : créée 150 enregistrements, supprime-les, le prochain aura un identifiant de 151 ...

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 102
    Points : 28 399
    Points
    28 399
    Par défaut
    Citation Envoyé par blapointe
    Ca nous renvoie à la question: "cela dépend-il des SGBD?".
    C'est le SGBD qui gère ses séquences comme il l'entend...
    Exemple : je travaille sur Teradata, SGBD orienté décisionnel et entrepôts de données.
    Depuis la version 5, il prend en charge les identifiants auto-incrémentés définis par la norme ANSI.
    Lors des opérations de chargements de fichiers dans des tables, donc insertion massive d'enregistrements, le SGBD ouvre plusieurs sessions simultanément et affecte à chacune des paquets de lignes, histoire d'optimiser les traitements en utilisant au mieux son architecture massivement parallèle.
    Pour perdre moins de temps à gérer l'identifiant auto-incrémenté, chaque session se voit attribuer une plage d'identifiants au fur et à mesure des besoins.
    A l'arrivée, toutes les lignes sont dans la table, affectées chacune d'un identifiant numérique unique mais dont la valeur n'a aucun rapport avec la position de la ligne dans le fichier source.

  7. #7
    Nouveau Candidat au Club
    Inscrit en
    Août 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Xo
    Je ne crois pas, pourquoi ?
    pour ça :

    "'utilisateur A, procède à l'acquisition d'une clef en vue de saisir les données afférentes à Monsieur Gilles LEBLANC. Il lui est attribué la clef 53 puisque la dernière valeur de clef stockée dans la table MaTable est 52. Quelques instants plus tard, l'utilisateur B convient de saisir les informations de Monsieur Pierre LENOIR et se fait attribuer lui aussi une clef. Vous aurez deviné que A n'a pas encore terminé de saisir ses informations et que par conséquent l'utilisateur B se voit attribuer la même valeur de clef que l'utilisateur A, à savoir 53"

    Mais bon, tout est clair maintenant. Merci pour vos réponses!!!!

  8. #8
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Citation Envoyé par blapointe
    L'utilisateur A, procède à l'acquisition d'une clef en vue de saisir les données afférentes à Monsieur Gilles LEBLANC. Il lui est attribué la clef 53 puisque la dernière valeur de clef stockée dans la table MaTable est 52. Quelques instants plus tard, l'utilisateur B convient de saisir les informations de Monsieur Pierre LENOIR et se fait attribuer lui aussi une clef. Vous aurez deviné que A n'a pas encore terminé de saisir ses informations et que par conséquent l'utilisateur B se voit attribuer la même valeur de clef que l'utilisateur A, à savoir 53
    Oui, ça, c'est le paragraphe "3.1. Une fausse bonne idée", la solution qui consiste à essayer de gérer soi-même le prochain identifiant, en lisant les autres valeurs déjà insérées dans la base, rien à voir avec un champ de type auto-incrément ou une séquence

    Citation Envoyé par blapointe
    Mais bon, tout est clair maintenant. Merci pour vos réponses!!!!

Discussions similaires

  1. [MPD] Identifiant auto incrémenté
    Par MacFly58 dans le forum Schéma
    Réponses: 9
    Dernier message: 19/12/2012, 22h54
  2. Réponses: 6
    Dernier message: 25/04/2008, 10h29
  3. [MySQL] Identifiant Primaire qui s'auto incrémente
    Par The Molo dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 18/04/2007, 13h58
  4. Réponses: 8
    Dernier message: 08/06/2006, 11h20
  5. Récuperer l'identifiant d'un auto-incrémente
    Par MANU_2 dans le forum Bases de données
    Réponses: 5
    Dernier message: 19/10/2005, 01h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo