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

SELECT und sperren Sie eine Zeile und dann UPDATE

Was Sie tun müssen, ist, hier eine Art Sperre hinzuzufügen, um Rennbedingungen wie die von Ihnen erstellte zu verhindern:

UPDATE persons SET processing=1 WHERE id=:id AND processing=0

Dadurch wird eine doppelte Sperrung vermieden.

Um dies noch weiter zu verbessern, erstellen Sie eine Sperrspalte, die Sie zum Beanspruchen verwenden können:

UPDATE persons
  SET processing=:processing_uuid
  WHERE processing IS NULL
  LIMIT 1

Dies erfordert einen VARCHAR , indizierte processing Spalte, die zum Beanspruchen verwendet wird und den Standardwert NULL hat . Wenn Sie eine geänderte Zeile in den Ergebnissen erhalten, haben Sie einen Datensatz beansprucht und können mit ihm arbeiten, indem Sie Folgendes verwenden:

SELECT * FROM persons WHERE processing=:processing_uuid

Generieren Sie bei jedem Versuch und Anspruch einen neuen Anspruchs-UUID-Schlüssel.