Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Administration
Administration Forum d'entraide sur l'administration de MySQL
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 05/08/2004, 09h52   #1
Invité de passage
 
Inscription : février 2003
Messages : 2
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 2
Points : 1
Points : 1
Envoyer un message via ICQ à Arnaud57 Envoyer un message via Yahoo à Arnaud57
Par défaut Modification simultanée d'un même enregistrement

Bonjour

Je souhaiterai savoir quelle est la méthode pour empêcher la modification simultanée d'un enregistrement dans une table MySQL. En pratique, le cas se pose lorsqu'un utilisateur va vouloir modifier un enregistrement pendant qu'un autre utilisateur est en train de le modifier. Les clé étant les même, le dernier qui va faire la modification sera le gagnant....

J'aimerai verrouiller la table uniquement en lecture mais si on verrouille la table et que l'utilisateur qui le navigateur sans avoir faire la requête UPDATE et donc le UNLOCK, la table serait alors VEROUILLER totalement....

Merci d'avance pour votre aide.

Arnaud
Arnaud57 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/08/2004, 11h04   #2
Expert Confirmé Sénior
 
Avatar de qi130
 
Homme Pierre
Ingénieur qualité méthodes
Inscription : mars 2003
Messages : 3 726
Détails du profil
Informations personnelles :
Nom : Homme Pierre
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Ingénieur qualité méthodes
Secteur : Finance

Informations forums :
Inscription : mars 2003
Messages : 3 726
Points : 4 739
Points : 4 739
Il existe au moins 2 techniques pour pallier ce problème. L'utilisation de l'une ou l'autre dépend de l'architecture technique de ton appli...

La 1ère consiste à utiliser un timestamp.
Cette technique est à employer si ton architecture est asynchrone (transactionnelle): l'utilisateur acquiert un enreg, le modifie, demande la sauvegarde. Là, on relie l'enreg en le lockant, on compare le timestamp relu avec celui acquis en début de transaction.
Si ok on écrit avec un nouveau timestamp et on délocke, si ko msg d'erreur et délockage.
Il faut bien sûr que la table héberge une colonne réservée au timestamp.
En général, ce timestamp est de format (avec des séparateurs si on veut, si le SGBD ne connait pas le type timestamp). Parfois le timestamp peut aller jusqu'aux millisecondes.

La 2nde consiste à locker la ligne (au mieux) ou la page (au pire ) [selon la richesse technique du SGBD => éviter les SGBD qui lockent au niveau table] au moment de l'acquisition pour modif. Evidemment ça bloque les autres utilisateurs sur cette ligne ou cette page (d'où l'importance de bien tailler la taille de la page sous certains SGBD: petites lignes + grosses pages= proba importante de bloquer qq'un d'autre)

En espérant avoir éclairé ta lanterne...
__________________
"Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
-----------------------
Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
Usus magister est optimus
qi130 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/08/2004, 11h24   #3
Invité de passage
 
Inscription : février 2003
Messages : 2
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 2
Points : 1
Points : 1
Envoyer un message via ICQ à Arnaud57 Envoyer un message via Yahoo à Arnaud57
Bonjour,

merci pour cette réponse très intéressante.

La première solution me semble plus adaptée que la seconde mais je n'ai pas tout compris à vrai dire.

Si on pouvait juste décrire un cas d'utilisation et si tu pouvais me dire si j'ai bien capté le truc.

- L'utilisateur 1 ouvra la page de modification de l'enregistrement.
>>>On modifie le timestand dans l'enregistrement (en faisant un update avec les même valeur je suppose)
- Ensuite l'utilisateur saisie les valeurs des nouveaux champs dans sa page php

Si un autre utilisateur souhaite modifier le même enregistrement, il ouvre la page et modifie lui aussi le timestand.

- Au moment de l'insertion du premier utilisateur, on LOCK la table, compare le timestand saisie au départ et le timestand de l'enregistrement à modifier et si ce sont les même alors on modifie sinon on rejette la modification et dans tous les cas on UNLOCK juste après.

- L'autre utilisateur enregistre alors et ça marche.

Du coup c'est le dernier utilisateur qui à le droit à l'enregistrement.

Merci beaucoup.

Si c'est bien ça, c'est pas mal

MERCI!!!
Arnaud57 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/08/2004, 11h25   #4
Invité de passage
 
Inscription : juillet 2003
Messages : 2
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 2
Points : 2
Points : 2
Par défaut SGBD modification unique

Moi pas du tout eclairer

Lanterne completement eteinte

surtout a partir de "si ok" keski est ok ?
gnolfy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/08/2004, 12h21   #5
Expert Confirmé Sénior
 
Avatar de qi130
 
Homme Pierre
Ingénieur qualité méthodes
Inscription : mars 2003
Messages : 3 726
Détails du profil
Informations personnelles :
Nom : Homme Pierre
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Ingénieur qualité méthodes
Secteur : Finance

Informations forums :
Inscription : mars 2003
Messages : 3 726
Points : 4 739
Points : 4 739
Par défaut Re: SGBD modification unique

Citation:
Envoyé par gnolfy
Moi pas du tout eclairer

Lanterne completement eteinte

surtout a partir de "si ok" keski est ok ?
la comparaison !
reformulation: si à la suite de cette comparaison, les timestamps sont identiques (=ok)...
__________________
"Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
-----------------------
Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
Usus magister est optimus
qi130 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/08/2004, 12h31   #6
Expert Confirmé Sénior
 
Avatar de qi130
 
Homme Pierre
Ingénieur qualité méthodes
Inscription : mars 2003
Messages : 3 726
Détails du profil
Informations personnelles :
Nom : Homme Pierre
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Ingénieur qualité méthodes
Secteur : Finance

Informations forums :
Inscription : mars 2003
Messages : 3 726
Points : 4 739
Points : 4 739
Citation:
Envoyé par Arnaud57
Bonjour,

merci pour cette réponse très intéressante.

La première solution me semble plus adaptée que la seconde mais je n'ai pas tout compris à vrai dire.

Si on pouvait juste décrire un cas d'utilisation et si tu pouvais me dire si j'ai bien capté le truc.

- L'utilisateur 1 ouvra la page de modification de l'enregistrement.
>>>On modifie le timestand dans l'enregistrement (en faisant un update avec les même valeur je suppose)
- Ensuite l'utilisateur saisie les valeurs des nouveaux champs dans sa page php

Si un autre utilisateur souhaite modifier le même enregistrement, il ouvre la page et modifie lui aussi le timestand.

- Au moment de l'insertion du premier utilisateur, on LOCK la table, compare le timestand saisie au départ et le timestand de l'enregistrement à modifier et si ce sont les même alors on modifie sinon on rejette la modification et dans tous les cas on UNLOCK juste après.

- L'autre utilisateur enregistre alors et ça marche.

Du coup c'est le dernier utilisateur qui à le droit à l'enregistrement.

Merci beaucoup.

Si c'est bien ça, c'est pas mal

MERCI!!!
Alors...
1 utilisateur veut modifier une fiche: plein de données et 1 timestamp valant ts1 (pour faire cours). le ts1 est en "réserve" quelque part en mémoire du PC de cet utilisateur. il fait Ok pour valider ses modifs et réécrire en BdD:
1/ relire la ligne en BdD (en fait seul le timestamp est nécessaire) en lockant
2/ comparer ce timestamp avec la valeur en mémoire
2.a/ si le timestamp vaut toujours ts1 => ok pour l'update avec nouvelle valeur du timestamp (=ts2), puis délocke
2.b/ si valeurs <> (ts1 vs. ts2) on délocke

Rappel, effectuer le lock sur le niveau le plus fin possible suivant le SGBD:
1/ la ligne si possible
2/ la page en 2ème choix
3/ la table si on peut pas faire autrement ( )
__________________
"Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
-----------------------
Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
Usus magister est optimus
qi130 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h37.


 
 
 
 
Partenaires

Hébergement Web