|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité régulier
![]() Inscription : novembre 2007 Messages : 67 ![]() |
Bonjour,
Je voudrais gérer les accès simultanés à la base mysql, et mettre les clients en file d'attente lors de la modification de la base : Code :
|
||
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Non select for update ne fonctionne pas en stateless, tu ne peux donc pas retourner vers le php.
Il faut passer par une procédure stockée. Par contre si le besoin est vraiment de faire num_user+1 tu peux le faire directement dans l'update: Code :
UPDATE TABLE_USERS SET num_users = num_users+1 WHERE id=1 |
|
|
00
|
|
|
#3 |
|
Invité régulier
![]() Inscription : novembre 2007 Messages : 67 ![]() |
J'ai besoin de récupérer une autre valeur entre le select et l'update, que je dois modifier et renvoyer, comment faire pour gérer les accès simultanés
|
|
|
00
|
|
|
#4 |
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Quel est le processus global ?
Sinon pour utiliser for update il faut utiliser une procédure stockée quand on développe autour du web. |
|
|
00
|
|
|
#5 | ||
|
Invité régulier
![]() Inscription : novembre 2007 Messages : 67 ![]() |
en fait j'ai aussi un champ qui contient du xml dans la base que je veux modifier
Code :
|
||
|
|
00
|
|
|
#6 |
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
En fait si la modification du xml est connu (je veux dire pas d'intervention via l'appli) et faisable au sein de la transaction utilisant la même connection alors je pense finalement que for update peut fonctionner.
Ce qui ne fonctionne pas c'est de proposer un écran d'édition de donnée dans une appli via for update puis après soumission du formulaire espérer faire la mise à jour, car techniquement ce sera probablement une nouvelle connection qui sera donc lockée. De toute façon c'est assez simple à tester à priori. Il suffit de ne pas commit la transaction puis d'essayer dans une autre page de traiter le xml normalement ça devrait blocker. Par contre comme tu n'auras plus la main pour commit la 1ere transaction il faudra surement la kill pour lever le lock. Si ça ne fonctionne pas tu peux utiliser un "lock otpimiste", par exemple ajouter une colonne timestamp que tu sélectionnes en même temps que le xml et faire l'update sur where id=1 and tstamp=$tstamp, mais dans ce cas un 2eme user peut arriver "après" traiter le xml "plus vite" et valider la transaction en 1er. Bon je ne sais pas si je suis vraiment très clair... et j'espère ne pas avoir dis de bêtise je n'ai jamais testé le for update en php/mysql |
|
|
00
|
|
|
#7 | ||
|
Invité régulier
![]() Inscription : novembre 2007 Messages : 67 ![]() |
"FOR UPDATE" ne fonctionne pas avec MyISAM, il faut apparemment InnoDB qui n'est pas disponible sur les hébergements mutualisés OVH.
en utilisant "LOCK TABLES" ça a l'air de marcher Code :
|
||
|
|
00
|
|
|
#8 |
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Ah oui j'étais parti du principe que vous aviez INNODB.
Effectivement LOCK TABLES peut marcher, vos tests semblent concluant, mais toute la table est blockée le temps du traitement à la GRANDE différence avec FOR UPDATE où seule une ligne est lockée. Si cette contrainte n'est pas trop grande dans votre situation (pas trop d'utilisateurs voulant utiliser la table ) alors oui pourquoi pas, sinon regardez peut être du côté de ma proposition de lock optimiste avec timestamp. |
|
|
00
|
|
|
#9 |
|
Invité régulier
![]() Inscription : novembre 2007 Messages : 67 ![]() |
ce qui m'inquiète c'est la commandeelle débloque toutes les tables, pas seulement la table "TABLE_USERS" que j'ai bloqué.
Est-ce que ce code fonctionne : Code :
$QueryUnlock = 'UNLOCK TABLES TABLE_USERS'; |
|
|
00
|
|
|
#10 | |
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
D'après la doc
Citation:
Qu'as tu observé ? Je n'ai personellement jamais utilisé ce genre de "fonctionnalité". |
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com