|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre du Club
![]() Inscription : juillet 2008 Messages : 106 ![]() |
Bonjour,
Je rencontre un problème pour récupérer le dernier id créé. C'est à dire que je fais un enregistrement dans ma table et pour récupérer l'id de cet enregistrement je fais une sélection par ordre décroissant des id et je sélectionne le premier. Mon soucis et que s'il y a deux utilisateurs simultanés, l'un pourrait se retrouver avec l'enregistrement de l'autre et vice et versa. Je voulais donc savoir si l'y avait un autre moyen plus efficace et sûr de récupérer le dernier id créé ? J'ai une base de données access et je code en asp. Merci A+ |
|
|
00
|
|
|
#2 |
|
Membre éclairé
![]() Inscription : décembre 2004 Messages : 463 ![]() |
bonjour,
si tu fait une lecture du dernier ID et que tu crées immédiatement derrière le nouveau enregistrement + 1 il y a peu de chance que deux personnes le fassent en même temps mais comme nous ne pouvons jurer de rien, tu as la possibilité de générer un id automatique avec une chaîne alléatoire de lettres, chiffres et caractères où la probabilité de doublons sera quasi nulle si tu parts sur du 120 positions ou l'idéal est de bloquer ta base avant le select, de créer l'enregistrement et de libérer la base pour le prochain. |
|
|
00
|
|
|
#3 |
|
Membre du Club
![]() Inscription : juillet 2008 Messages : 106 ![]() |
Je suis d'accord avec toi vva, la probabilité est vraiment très petite mais j'ai beau l'expliquer à mon chef il veut du sûr à 99,9%...
Donc ce que tu dis de bloquer l'accès le temps de récupérer l'id me plaît pas mal, mais je ne sais pas comment on fait cette manip, peux tu me l'expliquer stp ? Merci |
|
|
00
|
|
|
#4 |
|
Membre éclairé
![]() Inscription : décembre 2004 Messages : 463 ![]() |
regardes du côté des commandes COMMIT et ROLLBACK
debut de l'exemple de transaction select * from mabase début de transaction nommé Trans1*/ begin transaction Trans1 go modification souhaitée update mabase set ProductName = 'xxxxx' where ProductID = 1 go vérification si la ligne a bien été modifié select * from ma base /* maintenant deux choix possible soit je fais un commit transaction Trans1 , qui valide mon opération soit je fais un commit rollback ,qui annule l'opération*/ soit commit transaction Trans1 /*ou*/ Commit rollback voilà tu peux donc faire des update,insert ... dans tous les sens et avec un simple Commit rollback tu annules tout Nb : pour les developpeurs c'est trés utilile si vous faites plusieurs opérations SQL dans votre code à la moindre exeception un petit rollBack au serveur SQL , et hop le SGBD est nickel chrome , deplus un commit bloque la BD pour les autres clients connecté jusqu'au commit transaction ou commit rollback ,cela évite d'updater une même ligne par différents clients avant la fin d'un traitement |
|
|
00
|
|
|
#5 |
|
Membre du Club
![]() Inscription : juillet 2008 Messages : 106 ![]() |
Merci vva pour toutes ces informations je vais chercher avec mon ami google pour avoir plus d'explications sur tous ça.
A+ et merci |
|
|
00
|
|
|
#6 |
![]() ![]() |
Salut,
En supposant ton cas, pourquoi ne pas créer un champ heure affichant hh:mm:ss ainsi il y aurait très peu de chance pour que les deux utilisateur et exactement le meme nombre de seconde et par la même tu récupère le dernier id
__________________
Ne dites pas Java pour dire Javascript ! Ces deux codes n'ont rien à voir ! // Essayez d'expliquer, de la façon la plus claire possible votre problème. // Parfois une image vaut mieux qu'un long discours FAQ ASP |
|
|
00
|
|
|
#7 | |||||
|
Expert Confirmé Sénior
![]() ![]() ![]() Inscription : mars 2004 Messages : 5 862 ![]() |
Salut,
[EDIT]Pour ne pas être méchant[/EDIT]Hum Hum... Les transactions sont faites pour replacer la base de données dans l'etat d'origine précédent les mises à jour. Pourquoi? Imaginons qu'il soit necessaire d'enregistrer des données dans plusieurs tables pour valider un achat sur un site commercial. Si une insertion echoue en cour de route il faut revenir à l'etat d'origine car plusieurs insertion précédentes peuvent avoir réussies. Ces dernières seraient incohérentes sans les données complémentaires qui n'ont pas pu être enregistrées. Il faut donc supprimer le travail effectué. Si il s'agit d'une seule insertion c'est absolument inutile!! En cas d'echec rien ne sera fait tout simplement. Si vous voulez savoir combien d'enregistrements ont été affectés, il suffit de récupérer cette information quand elle est renvoyée par l'execution de la requete. Un "1" indique que l'enregistrement a bien été mis à jour/inséré. Citation:
Pourquoi refaire un select juste derrière?!! Ceux qui conseillent ce genre de choses devraient se poser plus de questions sur la gestion des ressources de leurs applications. En effet, dans un environnement fortement sollicité il est anti-productif voir nuisible de faire ce genre de chose. Les ressource d'un environnement applicatif ne sont pas infinies. Chaque opération inutile ajoute de la charge aux serveurs. Pour récupérer un identifiant dans une base SQLServer, il faut utiliserou Rien d'autre! Exemple: Code :
Pour Access Code :
|
|||||
|
00
|
|
|
#8 |
|
Membre éclairé
![]() Inscription : décembre 2004 Messages : 463 ![]() |
immobilis ton commentaire est très interessant et c'est bien de prendre en considération les performances des DB. Je lui ai donné une marche à suivre donc le select * doit être adapté ici en l'occurence il mettra le nom du champs de l'ID pour limiter les volumes et il n'est pas non plus obligé de le faire deux fois encore une fois c'est une indication et non un ordre strict de procéder.
pour l'ajout du champs hh.mm.ss à mon avis pas d'intérêt car le soucis ici est de s'assurer qu'au moment de l'enregistrement l'id généré sera unique ce qui est loin d'être le cas si l'on travaille avec une DB de plusieurs millions d'enreg comme l'a souligné immobilis, la possibilité de doublons ne sera pas exclus dans ce cas. immobilis désolé mais je ne vois pas en quoi l'utilisation du SCOPE_IDENTITY()ou du @@IDENTITY assurera à notre ami la création d'un ID unique car la DB n'est pas bloquée avec cette commande et qu'un autre utilisateur peut enregistrer en même temps. en reprennant plus en détail la demande, il est question de base access alors pourquoi ne pas déclarer le champs ID comme automatique, notre ami n'aura pas a géré la génération de l'ID et normalement access devrait éviter les doublons non ? Veriecherie une autre méthode si le COMMIT est trop lourd tu boucles ta procédure d'insertion jusqu'autant que ton id est unique même si immobilis considère que c'est gourmand en ressources |
|
|
00
|
|
|
#9 | ||
|
Expert Confirmé Sénior
![]() ![]() ![]() Inscription : mars 2004 Messages : 5 862 ![]() |
Citation:
Citation:
A+ |
||
|
00
|
Copyright © 2000-2012 - www.developpez.com