Разрабатываю браузерную игру, в которой есть рынок. На рынке продаются семена и каждый пользователь может выставить свои семена на продажу. Возник вопрос одновременного использования.
Таблица выглядит так:
id | user_id | amount
1 | 4 | 0
2 | 1 | 30
3 | 5 | 10
В php алгоритм действий такой:
1 - Выбираю первую запись в таблице, у которой amount > 0 (то есть еще есть семена на продаже)
2 - Обновляю запись в таблице, уменьшая ей amount
В этом случае, может быть такое, что одновременно несколько пользователей обратятся к рынку и получат одну и ту же запись. (А такое может быть, так как кнопка одна и действие простое).
То есть, алгоритм такой:
1 пользователь - SELECT * FROM market WHERE amount > 0 LIMIT 1
2 пользователь - SELECT * FROM market WHERE amount > 0 LIMIT 1
1 пользователь - UPDATE market SET amount = amount - 10 WHERE id LIKE id
И в этот момент второй пользователь тоже обновляет запись, но он не знает, что там количество семян уже уменьшилось. Как быть в этом случае?
Я копал в сторону следующего алгоритма:
1. Получаем amount последней записи и обнуляем ее
2. Затем обновляем amount (вычитаем купленные семена) и обновляем запись в таблице (возвращаем некупленные семена)
Но в таком случае (насколько я нагуглил) невозможно сделать SELECT перед UPDATE в одном запросе.
Как правильно это реализовать в MySQL? Может поменять алгоритм?