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

Requêtes MySQL Discussion :

Requête retournant un id unique


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Inscrit en
    Décembre 2003
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 87
    Points : 87
    Points
    87
    Par défaut Requête retournant un id unique
    Bonjour,

    Je cherche à faire une requête retournant un id unique à chaque fois que je l’exécute. Le but est de permettre à plusieurs processus d’exécuter cette requête en parallèle et d'obtenir à chaque fois un ID unique entre tous les processus. La base de donnée est le seul point commun entre les différents processus d'ou mon idée d'y stocker cet ID.

    Si je fais un UPDATE pour incrémenter la valeur suivit d'un SELECT pour la récupérer, j'ai peur d'avoir des problèmes de concurrence :
    • process 1 UPDATE ID+1
    • process 2 UPDATE ID+1
    • process 1 SELECT ID
    • process 2 SELECT ID

    => les process 1 et 2 ont le meme ID.

    Y a t'il un moyen de réaliser cette opération de manière atomique?

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    À quoi doit servir cet id unique généré, si j'ai bien compris, à l'exécution d'une requête ?

    Ce que tu peux faire, c'est une table de séquence avec juste un identifiant entier auto-incrémenté.
    Ensuite, soit tu crées une procédure stockée qui insère une ligne dans la table de séquence puis exécute la requête SELECT et renvoie le résultat du SELECT + le numéro de séquence ajouté dans une colonne supplémentaire du SELECT (toutes les lignes du SELECT auront alors la même valeur pour cette colonne), soit le programme externe qui lance la requête insère au préalable une ligne dans la table de séquence, récupère l'id ajouté puis exécute la requête SELECT.

    Il faudrait nous en dire plus sur la nature du besoin pour qu'on puisse t'aider plus efficacement car ta demande est inhabituelle.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre régulier
    Inscrit en
    Décembre 2003
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 87
    Points : 87
    Points
    87
    Par défaut
    Hum désolé, je me suis mal exprimé. Mon but est de récupérer un numéro de séquence unique qui me servira à identifier des opérations exécuté par différents processus. En gros, j'ai plusieurs processus (soit le même soft lancé plusieurs fois, soit différents softs) qui exécutent différentes opérations. Chacun de ces processus à besoin d'un numéro de séquence unique pour identifier l'opération qu'il est en train d'exécuter.

    Je suis désolé j'ai du mal à expliquer clairement le pourquoi du comment sans partir dans un roman de 80 pages. Pour essayer de résumer le déroulement typique d'un processus sera le suivant :

    1. début
    2. récupérer le numero de séquence unique
    3. effectuer une opération
    4. fournir le résultat de l'opération et le numéro de séquence à un autre process


    Comme le seul point commun entre tous les processus est la base de donnée, j'ai pensé stocker ce numéro de séquence unique dans la base de donnée. J'espère avoir été plus clair sur mes besoins.

    Ensuite, soit tu crées une procédure stockée qui insère une ligne dans la table de séquence puis exécute la requête SELECT et renvoie le résultat du SELECT + le numéro de séquence ajouté dans une colonne supplémentaire du SELECT (toutes les lignes du SELECT auront alors la même valeur pour cette colonne)
    Je n'ai jamais utilisé de procédure stockées, je ne comprends pas trop ce que tu veux dire.

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Et bien ton processus se rapproche de ce que je suggérais donc ce que j'ai proposé - la table de séquence - devrait satisfaire ton besoin.

    Il suffit que ton processus exécute une requête d'insertion dans la table de séquence et récupère le mysql_insert_id.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre régulier
    Inscrit en
    Décembre 2003
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 87
    Points : 87
    Points
    87
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Il suffit que ton processus exécute une requête d'insertion dans la table de séquence et récupère le mysql_insert_id.
    Mais dans ce cas la est-ce que je ne risque pas d'avoir des problèmes de concurrence? Si deux processus essaient de récupérer un numéro de séquence en même temps je peux me retrouver dans la situation suivante:
    1. p1: INSERT (last id = 1)
    2. p2: INSERT (last id = 2)
    3. p1: get mysql_insert_id (last id = 2)
    4. p2: get mysql_insert_id (last id = 2)

    non?

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Non car le processus qui lance la requête d'insertion récupère l'identifiant inséré dans la même transaction.

    Si tu programmes en PHP, cela donnerait ce code :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $connexion_db = mysql_connect("serveur", "user_mysql", "password");
     
    $sql = "
    	INSERT INTO sequence (sqc_id)
    	VALUES (NULL)
    ";
     
    mysql_query($ql, $connexion_db);
     
    $num_sequence = mysql_insert_id($connexion_db);
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Membre régulier
    Inscrit en
    Décembre 2003
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 87
    Points : 87
    Points
    87
    Par défaut
    Ok, c'est parfait alors...

    Et ce n'est pas possible d'effectuer cette opération sans insérer une nouvelle ligne dans la table? Genre en incrémentant juste une valeur?

  8. #8
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Il faut bien que cette valeur soit stockée d'une manière ou d'une autre pour que tu puisses l'incrémenter à l'opération suivante. Le meilleur moyen est la séquence maîtrisée par le SGBD.

    Tu peux aussi utiliser cette table pour y enregistrer tes opérations si nécessaire ; il suffit d'ajouter les colonnes adéquates.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  9. #9
    Membre régulier
    Inscrit en
    Décembre 2003
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 87
    Points : 87
    Points
    87
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Il faut bien que cette valeur soit stockée d'une manière ou d'une autre pour que tu puisses l'incrémenter à l'opération suivante.
    Oui en effet mais en utilisant cette méthode je vais avoir une table avec de plus en plus d'enregistrements. Je pensais plus à un enregistrement unique dont la valeur s'incrémente à chaque utilisation.

  10. #10
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Sauf que tu retombes dans le risque que tu percevais car tu as deux étapes au lieu d'une :

    Processus A change la valeur de l'id en l'incrémentant.
    Processus A interroge la table pour obtenir la nouvelle valeur.

    Rien n'interdit que Processus B vienne incrémenter l'id avant l'interrogation par processus A.

    À moins que tu aies un flux de processus hyper important, ne soit pas trop inquiet pour ta table qui grossit ; un entier simple, c'est 4 octets et tu peux avoir plus de 2 milliards de valeurs, plus de 4 milliards en UNSIGNED.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  11. #11
    Membre régulier
    Inscrit en
    Décembre 2003
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 87
    Points : 87
    Points
    87
    Par défaut
    Ok j'ai compris, merci beaucoup.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 06/09/2006, 13h56
  2. Réponses: 3
    Dernier message: 02/06/2006, 13h38
  3. Pb requête retournant les n premiers
    Par Sakalam dans le forum Access
    Réponses: 4
    Dernier message: 20/04/2006, 10h51
  4. Savoir si une requête retourne un résultat ou pas
    Par zut94 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 30/09/2005, 15h48
  5. 2 tables; requête : retourner différences entre les 2
    Par azerty dans le forum Langage SQL
    Réponses: 15
    Dernier message: 09/09/2003, 18h35

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