Родното заключване на MySQL не предоставя тази функционалност. Можете да използвате колона, за да извършите вашите „заключвания“.
Ако приемем, че всяка нишка има уникален идентификатор, можете да създадете колона с име thread_owner
, със стойност по подразбиране 0.
Една нишка ще вземе ред като този:
UPDATE mytable
SET thread_owner = :my_threadID
WHERE thread_owner = 0
LIMIT 1
След това изберете реда по този начин (може да не върне нищо, ако няма редове за обработка):
SELECT *
FROM mytable
WHERE thread_owner = :my_threadID
След това го обработете и накрая го изтрийте.
Това решение ще работи както на MyISAM, така и на InnoDB.
Въпреки това, за InnoDB може да е бавно, тъй като всеки израз UPDATE се опитва да заключи всички редове, където thread_owner =0, и освен ако не сте сигурни, че заключвате всички редове в същия ред всеки път, това може дори да причини блокиране. Така че можете да опитате изрично да заключите цялата таблица във вашия оператор UPDATE:
LOCK TABLES mytable WRITE;
UPDATE mytable
SET thread_owner = :my_threadID
WHERE thread_owner = 0
LIMIT 1;
UNLOCK TABLES;
По този начин MyISAM и InnoDB ще работят по същия начин.