Native MySQL-vergrendeling biedt deze functionaliteit niet. Je zou een kolom kunnen gebruiken om je "sloten" uit te voeren.
Ervan uitgaande dat elke thread een unieke ID heeft, kunt u een kolom maken met de naam thread_owner
, met standaard 0.
Een thread zou een rij als deze pakken:
UPDATE mytable
SET thread_owner = :my_threadID
WHERE thread_owner = 0
LIMIT 1
Selecteer vervolgens de rij als volgt (het zou er geen kunnen opleveren, als er geen rijen waren om te verwerken):
SELECT *
FROM mytable
WHERE thread_owner = :my_threadID
Verwerk het dan en verwijder het uiteindelijk.
Deze oplossing zou werken op zowel MyISAM als InnoDB.
Voor InnoDB kan het echter traag zijn omdat elke UPDATE-instructie alle rijen probeert te vergrendelen waarbij thread_owner =0, en tenzij u zeker weet dat u alle rijen elke keer in dezelfde volgorde vergrendelt, kan dit zelfs een impasse veroorzaken. U kunt dus proberen de hele tabel expliciet te vergrendelen in uw UPDATE-statement:
LOCK TABLES mytable WRITE;
UPDATE mytable
SET thread_owner = :my_threadID
WHERE thread_owner = 0
LIMIT 1;
UNLOCK TABLES;
Op die manier werken zowel MyISAM als InnoDB op dezelfde manier.