|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Nouveau Membre du Club
![]() Étudiant Inscription : mai 2009 Messages : 102 ![]() |
Salut à tou(te)s !
Voici la situation: -j'ai un serveur mysql5.5 fraichement installé et configuré. Ainsi que mysql workbench. -j'ai créé une BDD (moteur innoDB) contenant une table. Dans cette table j'ai une clé formée par un couple (vendor_id, service_id), plus un autre champs qui représente un numéro de série en fonction du couple précédent. -Le but est de se connecter à la table en question (depuis un client C#) et de pouvoir récupérer un numéro de série puis l'incrémenter. Le numéro de série doit être unique. ça se complique dès que je veux passer à plusieurs clients qui demandent des numéros de série. j'ai lancé par exemple deux clients qui demandent un numéro de série (Select sur le champs en question de la base) puis qui incrémentent la valeur du champ en question. Tout ça dans une boucle "for". Les deux clients que j'ai lancé en simultané se sont jusqu'ici attribué des numéros de série déjà utilisés. Le problème vient certainement du fait qu'il y a des accès concurrents et qu'entre la lecture du champ et sa mise à jour les autres clients accèdent au champ. Je n'ai pas réussi pour le moment à locker la ligne entre le moment ou un client la lit et la modifie. De sorte que les autres clients ne puissent pas prendre une valeur non à jour. J'espère que c'est assez clair, et que vous aurez des idées. Bonne soirée, et merci d'avance ! |
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() |
Bonsoir,
Le mieux à mon avis c'est de laisser MySQL affecter le numéro de série lui-même à l'aide d'un auto-incrément.
__________________
www.nudge.org Surveillez et optimisez vos applications Java |
|
|
00
|
|
|
#3 |
|
Nouveau Membre du Club
![]() Étudiant Inscription : mai 2009 Messages : 102 ![]() |
Si je ne me trompe pas, l'auto-incrément s'utilise dans le cas d'un nouvel enregistrement dans la table. Alors l'index de cette table s'auto-incrémente pour la nouvelle ligne.
Dans mon cas, je souhaiterais uniquement modifier l'enregistrement en question (la ligne) en incrémentant le champ représentant le numéro de série. Et non pas créer un nouvel enregistrement dans la table. |
|
|
00
|
|
|
#4 | |||
![]() ![]() |
Citation:
Code :
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
|||
|
00
|
|
|
#5 | |||||||
|
Nouveau Membre du Club
![]() Étudiant Inscription : mai 2009 Messages : 102 ![]() |
Citation:
Code :
Voici le code C# pour faire mes tests. J'ai mis délibérément un sleep de 5 secs entre l'envoi des deux requêtes au serveur pour voir si c'est sécurisé. J'ai deux clients en parallèle avec le même code. Le problème est qu'il n'y a aucune sécurité entre le SELECT pour lire la valeur courante du SN et la requête update. Si mon deuxième client tape en lecture sur la table entre les deux requêtes du premier client il aura un numéro déjà donné au premier client. N'y a-t-il pas un mécanisme ( transaction ? ) pour verrouiller la table entre ces deux requêtes ? Bon apparemment j'ai trouvé la solution... Il fallait désactiver le autocommit en rajoutant un "START TRANSACTION" au debut du script et un "COMMIT" à la fin. Dites moi ce que vous en pensez... Code :
|
|||||||
|
|
00
|
|
|
#6 |
![]() ![]() |
Ne connaissant pas C# et en regardant rapidement le code, j'ai du mal à comprendre l'utilité du SELECT mais bon...
Si ça fonctionne comme tu le souhaites, n'oublie pas de marquer
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
|
00
|
|
|
#7 |
|
Nouveau Membre du Club
![]() Étudiant Inscription : mai 2009 Messages : 102 ![]() |
Salut !
Le but premier du client c# est de récupérer le serial number stocké dans la base de données... D'où le sélect... Ensuite il incrémente la valeur et met a jour la table... |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com