2010-07-02 6 views
6

Comment obtenir les lignes exactes affectées par une instruction SQL UPDATE dans MySQL? J'ai beaucoup de clients sur beaucoup d'ordinateurs qui peuvent mettre à jour des lignes dans la même table basée sur des clauses WHERE à tout moment, et chaque client doit faire quelque chose dans un autre système pour chaque rangée qu'ils affectent, obtenant ainsi la liste de les objets affectés doivent être précis et ne pas être vulnérables aux conditions de course.sélectionnez les lignes affectées par une mise à jour

Certaines bases de données prennent en charge UPDATE ... OUTPUT UPDATED.id WHERE ... par exemple. SQL Server. Comment pouvez-vous faire cet atomique UPDATE/SELECT dans MySQL?

(j'ai vu des suggestions de faire la SELECT d'abord, puis en utilisant les ID comme une clause IN dans le UPDATE. Mais un autre client peut exécuter le même SELECT et récupérer les mêmes lignes alors que le premier client est sa queue UPDATE etc. ?)

Répondre

2

Utilisez le verrouillage de table ou les transactions (si elles sont prises en charge par le moteur de stockage) pour éviter les conditions de concurrence.

LOCK TABLES tablename; 
SELECT * FROM tablename WHERE x. 
do something else 
UPDATE tablename SET y WHERE x. 
UNLOCK TABLES 
1

C'est ce que je l'ai utilisé avant, et il y a une instance de quelqu'un d'autre utiliser here on Stackoverflow:

UPDATE my_table SET 
    id = (SELECT @id := id), 
    <column> = 'value'   
    WHERE <condition>; 

@id contiendra l'ID de ligne mise à jour, ou si n NULL o ligne a été mise à jour. Cela ne fonctionnerait que pour les mises à jour sur une seule ligne.