Есть следующий запрос, в котором ,я ожидал, что будет выбираться одна запись браться блокировка, опять же на одну запись, ставить флаг - используется и отпускать блокировку на эту запись, но судя по ошибке
'Lock wait timeout exceeded; try restarting transaction'
, блокировка береться всей таблицы, а так как у меня процессов 300 одновременно пытаются получить запись с этой таблицы, это очень плохо.
begin;
SELECT GetDistance('newhaven', area) as distance, id = (SELECT @proxy_id := id) from checkins
WHERE last_checkin > DATE_SUB(NOW(), INTERVAL 5 MINUTE)
AND active = 1
AND offline = 0
AND usage_flag = 0
ORDER BY distance ASC, RAND() limit 1 FOR UPDATE;
UPDATE checkins set usage_flag=1 where id=@proxy_id;
commit;
Прошу совета, как лучше организовать данное дело.
Спасибо.