Natywne blokowanie MySQL nie zapewnia tej funkcjonalności. Możesz użyć kolumny do wykonania swoich "blokad".
Zakładając, że każdy wątek miał unikalny identyfikator, możesz utworzyć kolumnę o nazwie thread_owner
, domyślnie 0.
Jeden wątek chwyciłby wiersz w ten sposób:
UPDATE mytable
SET thread_owner = :my_threadID
WHERE thread_owner = 0
LIMIT 1
Następnie wybierz wiersz w ten sposób (może zwrócić brak, jeśli nie ma wierszy do przetworzenia):
SELECT *
FROM mytable
WHERE thread_owner = :my_threadID
Następnie przetwórz i na koniec usuń.
To rozwiązanie działałoby zarówno na MyISAM, jak i InnoDB.
Jednak w przypadku InnoDB może to być powolne, ponieważ każda instrukcja UPDATE próbuje zablokować wszystkie wiersze, w których właściciel_wątku =0, i jeśli nie masz pewności, że blokujesz wszystkie wiersze za każdym razem w tej samej kolejności, może to nawet spowodować zakleszczenie. Możesz więc spróbować jawnie zablokować całą tabelę w instrukcji UPDATE:
LOCK TABLES mytable WRITE;
UPDATE mytable
SET thread_owner = :my_threadID
WHERE thread_owner = 0
LIMIT 1;
UNLOCK TABLES;
W ten sposób zarówno MyISAM, jak i InnoDB będą działać w ten sam sposób.