sql >> Databasteknik >  >> RDS >> Mysql

mysql - Låsa rader för vald fråga?

Native MySQL-låsning ger inte denna funktionalitet. Du kan använda en kolumn för att utföra dina "låsningar".

Förutsatt att varje tråd har ett unikt ID kan du skapa en kolumn med namnet thread_owner , med standardvärdet 0.

En tråd skulle fånga en rad så här:

UPDATE mytable
SET thread_owner = :my_threadID
WHERE thread_owner = 0
LIMIT 1

Välj sedan raden så här (den kanske inte returnerar några, om det inte fanns några rader att bearbeta):

SELECT *
FROM mytable
WHERE thread_owner = :my_threadID

Bearbeta det sedan och till sist ta bort det.

Denna lösning skulle fungera på både MyISAM och InnoDB.

Men för InnoDB kan det vara långsamt eftersom varje UPDATE-sats försöker låsa alla rader där thread_owner =0, och om du inte är säker på att du låser alla rader i samma ordning varje gång, kan det till och med orsaka ett dödläge. Så du kan försöka att explicit låsa hela tabellen i din UPDATE-sats:

LOCK TABLES mytable WRITE;
UPDATE mytable
SET thread_owner = :my_threadID
WHERE thread_owner = 0
LIMIT 1;
UNLOCK TABLES;

På så sätt kommer både MyISAM och InnoDB att fungera på samma sätt.



  1. Simple Express-program för att söka efter ett resultat

  2. Hur bygger man en kolvapplikation runt en redan befintlig databas?

  3. Räknar alla rader med specifika kolumner och grupperar efter vecka

  4. hur lagrar jag en youtube-inbäddningslänk i en databas