Автор темы
Небольшой Callcenter. Агенты при помощи клиентской программы получают контактные телефоны.
Само собой разумеется, различным агентам не должны попасть одинаковые телефоны одновремменно. Хорошо.
Выбираем строку из таблицы, запираем ее(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) во время выбора. Правда, тогда всем остальным
придется ждать, пока первый закончит операцию, потом другой и так далее.
Нужеле нет другого выхода? Мне кажется, что это стандартная проблема, но к сожалению, я с ней столкнулся впервые.
Может быть кто-то подскажет. Заранее благодарен.
Само собой разумеется, различным агентам не должны попасть одинаковые телефоны одновремменно. Хорошо.
Выбираем строку из таблицы, запираем ее(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) во время выбора. Правда, тогда всем остальным
придется ждать, пока первый закончит операцию, потом другой и так далее.
Нужеле нет другого выхода? Мне кажется, что это стандартная проблема, но к сожалению, я с ней столкнулся впервые.
Может быть кто-то подскажет. Заранее благодарен.