2013-06-16 3 views
0

Un nouveau projet m'a forcé à verrouiller une table pendant le traitement des mises à jour. J'ai suivi chaque suggestion et guide que je peux trouver, y compris How to lock mysql tables in php et http://dev.mysql.com/doc/refman/5.1/en/innodb-locking-reads.html, mais j'ai toujours la même erreur: # 1064 - Vous avez une erreur dans votre syntaxe SQL; vérifier le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de 'LIMIT 0, 30' à la ligne 1MySql "For Update" entraîne l'erreur

Afin de surmonter tous les démons possibles dans ma table en direct, j'ai créé une nouvelle table sur le moteur InnoDB pour les tests, a ajouté l'index unique, inséré quelques lignes, et utilisé la syntaxe suivante pour interroger:

SELECT svalue FROM `test` WHERE skey='key2' for update; 

qui produit la même erreur. Suppression du pour la mise à jour; de la requête permet à la requête de s'exécuter sans erreur.

Je ne suis pas sûr de ce que je fais mal, et j'ai essayé tout ce que je peux penser. S'il vous plaît, aidez-moi à comprendre ce qui me manque!

Merci

Répondre

0

La plupart du temps, MySQL va gérer le verrouillage de table ou d'une ligne lorsque vous utilisez les transactions (InnoDB-dactylographiées).

//Doing transactions 
mysql_query("SET AUTOCOMMIT=0"); 
mysql_query("START TRANSACTION"); 
$query = "SELECT svalue FROM `test` WHERE skey='key2'"; 

if($query) 
{ 
    mysql_query("COMMIT"); 
}else{ 
    mysql_query("ROLLBACK"); 
} 
+0

Mon but est de sélectionner une valeur existante de la table, puis incrémenter et mettre à jour tout en s'assurant qu'un autre processus ne lit pas l'ancienne valeur avant la fin de la mise à jour. La plupart de mes recherches ont indiqué «Pour la mise à jour» pour ce scénario, y a-t-il un avantage à utiliser des transactions à la place? – Jimmyb

+0

@ foxns7: op est effectivement correct pour verrouiller la ligne. Une transaction concurrente pourrait le modifier. –

0

Le verrouillage en dehors d'une transaction est généralement insignifiant. Ceci explique probablement l'erreur de syntaxe.

BTW, si vous êtes simplement en cherchant à augmenter la valeur d'une colonne (votre commentaire), actualisateurs directement:

update tbl set col = col + 1 where ... 
+0

Le problème que je rencontre est que j'ai besoin de connaître la nouvelle valeur à laquelle le col a été mis à jour. Je n'ai pas été en mesure de trouver une déclaration "Mettre à jour et retourner la valeur" comme Postgres a. Et j'essayais de suivre le code sur la page dev.mysql.com listée dans ma question, qui montre cet exemple: SELECT counter_field FROM child_codes FOR UPDATE; MISE À JOUR child_codes SET counter_field = counter_field + 1; Dois-je envelopper dans une transaction, est-ce mon problème? – Jimmyb

+0

Oui, c'est probablement le problème. En passant, si vous connaissez assez bien Postgres pour être au courant du retour des mises à jour, y a-t-il une raison particulière pour laquelle vous voulez revenir dans MySQL? :-) –

+0

Malheureusement, MySQL n'est pas mon choix sur ce projet particulier ... toujours redevable aux "pouvoirs en place". – Jimmyb