Mysql
 sql >> Database >  >> RDS >> Mysql

Leasing di lavori (aggiornamento atomico e get) da un database MySQL

La mia soluzione con un piccolo trucco:primo:devi usare una sottoselezione in modo che UPDATE non ora sia la stessa tabella un secondo:devi inizializzare @id con "(SELECT @id:=0)" altrimenti se la riga trovata non viene restituita l'ultimo valore impostato. Qui puoi anche specificare se restituiscono 0 o '' quando non viene trovato alcun risultato.

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