2013-07-05 1 views
1

J'ai besoin d'exécuter plusieurs sessions pour sélectionner des lignes dans MySQL. Dans chaque session, je sélectionne d'abord un nombre de lignes avec flag=0. Après cela, j'ai défini flag=1 pour ces lignes. Simultanément, je cours une autre session (ou plusieurs sessions), ce qui fait la même chose. Cependant, j'ai peur que la sélection d'une session puisse entrer en conflit avec d'autres sessions. Y a-t-il quelque chose que je puisse faire pour éviter ce conflit?mettre à jour/sélectionner des tables mysql dans plusieurs sessions

Je programme en utilisant Python et en utilisant le framework Django. Est-ce que Python ou Django ont une commande comme "synchronisation" pour s'assurer que ces deux sessions ne sont pas en conflit?

+0

Vous pouvez verrouiller les lignes sélectionnées en utilisant [SELECT FOR UPDATE] (http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html) –

Répondre

0

Ce type de coordination multisession n'est pas une fonction du langage client; c'est une fonction du SGBD. Vous sélectionnez les lignes FOR UPDATE, puis vous les mettez à jour et COMMIT votre transaction. Pour que cela fonctionne, votre table doit utiliser le moteur InnoDB (ou XtraDB). MyISAM ne peut pas le faire.

Votre opération fonctionne comme ceci:

START TRANSACTION /* this may have its own function call */ 

SELECT id, whatever 
    FROM table 
    WHERE flag = 0 
    LIMIT 10 
    FOR UPDATE; 

/* do what you need to do with each row selected */ 

UPDATE table SET flag = 1 WHERE ID = ?id 

COMMIT; 

Si je faisais ce que je considère l'utilisation de LIMIT 1 et la manipulation d'une ligne à la fois. Mais cela devrait fonctionner avec plusieurs lignes.

+0

Merci de votre réponse ! Juste une clarification. Avant "mise à jour set set flag = 1", l'indicateur est toujours 0. Si je comprends bien, "for update" réservera ces lignes, donc une autre instruction "select" ne sélectionnera pas ces lignes. Est-ce exact? Merci. – fanchyna

+0

C'est vrai. Une instruction select qui souhaite ces lignes se bloquera jusqu'à ce que votre transaction soit validée ou annulée. –

Questions connexes