Параллельный выбор данных
Само собой разумеется, различным агентам не должны попасть одинаковые телефоны одновремменно. Хорошо.
Выбираем строку из таблицы, запираем ее(id агента в столбец, скажем "lock_agent_id") и говорим этот агент ее выбрал.
Результат разговора сохраняется и телефон больше не выбирается. Тут все нормально.
Но, сам выбор: допустим
BEGIN
SELECT phone_id,name,phone INTO @phone_id,@name,@phone
FROM phones
WHERE lock_agent_id IS NULL.... LIMIT 1 FOR UPDATE;
UPDATE phones SET lock_agent_id=@agent_id WHERE phone_id = @phone_id;
...
RETURN
END
Агенты не получат одновременно один и тот же номер, но если одновременно несколько агентов выбирают из таблицы, то
один из них действительно получает номер, а остальные пустую строку.
Кажется, выход только один,- запереть всю таблицу (LOCK TABLE) во время выбора. Правда, тогда всем остальным
придется ждать, пока первый закончит операцию, потом другой и так далее.
Нужеле нет другого выхода? Мне кажется, что это стандартная проблема, но к сожалению, я с ней столкнулся впервые.
Может быть кто-то подскажет. Заранее благодарен.