Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Leasing-Jobs (Atomic Update and Get) aus einer MySQL-Datenbank

Meine Lösung mit einem kleinen Trick:Erstens:Sie müssen einen Subselect verwenden, damit UPDATE nicht jetzt dieselbe Tabelle ist. Zweitens:Sie müssen die @id mit "(SELECT @id:=0)" initialisieren, sonst, wenn die gefundene Zeile nicht zurückgegeben wird der zuletzt eingestellte Wert. Hier können Sie auch angeben, ob sie 0 oder '' zurückgeben, wenn kein Ergebnis gefunden wird.

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
  );