Есть таблица, в определенный момент одновременно может прийти 20-30 запросов. В этот момент создается новая запись в таблице для каждого, а в другой нужно обновить время и увеличить в ней же число. Так как запросов приходит одновременно много, не все числа складываются и в итоге не все данные учитываются при следующем selecte. Для того, чтобы избежать этого, стал юзать блокировки, но из-за этого падает скорость работы. Как можно этого избежать?
Опишите сначала что должно происходить, затем уже надо думать, что при этом пойдёт не так в конкурентной среде и как это избежать.
Пока что мне кажется что вам нужен уникальный индекс и insert on duplicate key update
Так оно у меня и работает. Но время обновляться должно всего лишь один раз, перед этим инфу нужно вытащить и посмотреть не имеется ли уже время там. И по итогу, когда приходит множество запросов, ни у кого еще нет этого времени. С блокировкой такой проблемы нет.
RastikRus, транзакции/блокировки. Других известных решений не знаю.
Либо отказаться от варианта с обновлением полей.
Вести полный лог неких ваших действий которые вы считаете, а считать по необходимости через count.
Либо делать это по крону например, т.е. логи обрабатывать по крону и записывать конечные данные уже потом.
Почитайте про очереди, если на пальцах, то вам нужен отдельный скрипт (демон), который будет с определенной периодичностью брать данные пачками (по n записей) из таблицы 1 и последовательно считать их и обновлять таблицу 2, факт обработки можно зафиксировать как с помощью доп. поля аля "is_processed", так и с помощью создания отдельной таблицы, строки в которой будут удаляться в процессе их обработки.