Précédent   Forum des professionnels en informatique > Bases de données > Décisions SGBD
Décisions SGBD Forum de décisions sur le choix en bases de données. Le Comparatif
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 24/08/2006, 13h25   #1
Invité de passage
 
Inscription : août 2006
Messages : 3
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 3
Points : 0
Points : 0
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!
blapointe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2006, 13h33   #2
Xo
Expert Confirmé
 
Avatar de Xo
 
Inscription : janvier 2005
Messages : 2 701
Détails du profil
Informations personnelles :
Âge : 38

Informations forums :
Inscription : janvier 2005
Messages : 2 701
Points : 3 237
Points : 3 237
Envoyer un message via Skype™ à Xo
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
__________________
"Ce que l'on conçoit bien s'énonce clairement,
Et les mots pour le dire arrivent aisément." Nicolas Boileau

"Expliquer empêche de comprendre si cela dispense de chercher"

Quiz Oracle : venez tester vos connaissances !

La FAQ Oracle : 138 réponses à vos questions
Aidez-nous à la compléter
Xo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2006, 13h39   #3
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 450
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 450
Points : 7 553
Points : 7 553
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.
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2006, 14h06   #4
Invité de passage
 
Inscription : août 2006
Messages : 3
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 3
Points : 0
Points : 0
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).
blapointe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2006, 15h27   #5
Xo
Expert Confirmé
 
Avatar de Xo
 
Inscription : janvier 2005
Messages : 2 701
Détails du profil
Informations personnelles :
Âge : 38

Informations forums :
Inscription : janvier 2005
Messages : 2 701
Points : 3 237
Points : 3 237
Envoyer un message via Skype™ à Xo
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 ...
__________________
"Ce que l'on conçoit bien s'énonce clairement,
Et les mots pour le dire arrivent aisément." Nicolas Boileau

"Expliquer empêche de comprendre si cela dispense de chercher"

Quiz Oracle : venez tester vos connaissances !

La FAQ Oracle : 138 réponses à vos questions
Aidez-nous à la compléter
Xo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2006, 15h44   #6
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 450
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 450
Points : 7 553
Points : 7 553
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.
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2006, 16h11   #7
Invité de passage
 
Inscription : août 2006
Messages : 3
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 3
Points : 0
Points : 0
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!!!!
blapointe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2006, 20h27   #8
Xo
Expert Confirmé
 
Avatar de Xo
 
Inscription : janvier 2005
Messages : 2 701
Détails du profil
Informations personnelles :
Âge : 38

Informations forums :
Inscription : janvier 2005
Messages : 2 701
Points : 3 237
Points : 3 237
Envoyer un message via Skype™ à Xo
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!!!!
__________________
"Ce que l'on conçoit bien s'énonce clairement,
Et les mots pour le dire arrivent aisément." Nicolas Boileau

"Expliquer empêche de comprendre si cela dispense de chercher"

Quiz Oracle : venez tester vos connaissances !

La FAQ Oracle : 138 réponses à vos questions
Aidez-nous à la compléter
Xo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h52.


 
 
 
 
Partenaires

Hébergement Web