2009-11-07 5 views
1

J'ai un champ compteur dans une table myisam. Pour mettre à jour la valeur du compteur dans un environnement multitâche (serveur web, requêtes simultanées de PHP), j'ai besoin de verrouiller l'enregistrement pour la mise à jour. Je fais comme ça:Question sur le verrouillage et les transactions sur la table MyISAM

START TRANSACTION; 
SELECT Counter FROM mytable ... FOR UPDATE; 
UPDATE Counter value or INSERT INTO mytable; 
// let's make sleep for 20 seconds here to make transaction longer 
COMMIT; 

Si je comprends bien, dans MyISAM toute la table doit être bloquée jusqu'à la fin de la transaction. Et quand j'initie une requête simultanée de PHP, en ouvrant un script dans un navigateur, il attend vraiment que le verrou soit parti. Mais si je sélectionne tous les enregistrements d'une table avec mysql.exe - il sélectionne tous les enregistrements même si le verrou doit être maintenu.

Donc, il semble que je ne comprends pas quelque chose. S'il vous plaît, expliquez un tel comportement.

Répondre

5

Les tables MyISAM ne prennent pas en charge les transactions - START TRANSACTION et COMMIT ne font rien.

Vous pouvez utiliser LOCK TABLES:

LOCK TABLES mytable READ; 
... 
UNLOCK TABLES; 
+0

Merci pour votre réponse. C'est vrai. Il semble que c'était mon serveur web qui était bloqué (Apache) et ne pouvait pas faire 2 requêtes en même temps. Très étrange. – nightcoder