Nativní zamykání MySQL tuto funkci neposkytuje. Můžete použít sloupec k provedení svých "zámků".
Za předpokladu, že každé vlákno mělo jedinečné ID, můžete vytvořit sloupec s názvem thread_owner
, s výchozí 0.
Jedno vlákno by zachytilo řádek jako tento:
UPDATE mytable
SET thread_owner = :my_threadID
WHERE thread_owner = 0
LIMIT 1
Poté vyberte řádek takto (může vrátit žádný, pokud nebyly žádné řádky ke zpracování):
SELECT *
FROM mytable
WHERE thread_owner = :my_threadID
Poté jej zpracujte a nakonec smažte.
Toto řešení by fungovalo na MyISAM i InnoDB.
V případě InnoDB to však může být pomalé, protože každý příkaz UPDATE se pokouší uzamknout všechny řádky, kde vlastník_vlákna =0, a pokud si nejste jisti, že pokaždé zamykáte všechny řádky ve stejném pořadí, může to dokonce způsobit uváznutí. Můžete tedy zkusit explicitně zamknout celou tabulku v příkazu UPDATE:
LOCK TABLES mytable WRITE;
UPDATE mytable
SET thread_owner = :my_threadID
WHERE thread_owner = 0
LIMIT 1;
UNLOCK TABLES;
Tímto způsobem budou MyISAM i InnoDB fungovat stejným způsobem.