sql >> Base de Datos >  >> RDS >> Mysql

Arrendamiento de trabajos (actualización atómica y obtención) de una base de datos MySQL

Mi solución con un pequeño truco:primero:debe usar una subselección para que ACTUALIZAR ahora no sea la misma tabla y segundo:debe inicializar el @id con "(SELECCIONAR @id:=0)" de lo contrario, si no encontró ninguna fila, regresa el último valor establecido. Aquí también puede especificar si devuelven 0 o '' cuando no se encuentra ningún resultado.

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