Mysql
 sql >> Base de données >  >> RDS >> Mysql

Location de travaux (mise à jour atomique et obtention) à partir d'une base de données MySQL

Ma solution avec une petite astuce :premièrement :vous devez utiliser une sous-sélection pour que UPDATE ne soit plus la même table et deuxièmement :vous devez initialiser le @id avec "(SELECT @id:=0)" sinon si aucune ligne n'est trouvée, ils retournent la dernière valeur définie. Ici, vous pouvez également spécifier s'ils renvoient 0 ou '' lorsqu'aucun résultat n'est trouvé.

UPDATE jobs SET lease=NOW() WHERE id =
  ( SELECT * FROM 
     ( SELECT @id:=id  FROM jobs,(SELECT @id:=0) AS tmp_id
       WHERE TIMESTAMPDIFF(HOUR,lease,NOW())>=8 
       AND NOT complete ORDER BY priority LIMIT 1
     ) AS tmp
  );