У нас есть веб-приложение (это игра) с множеством различных форм и элементов, которые действуют как кнопки и запускают какие-то действия на сервере. Проблема в том, что иногда пользователи могут запутаться в нашем приложении, если он слишком быстро нажимает на кнопки или открывает сайт в двух вкладках, а затем выполняет какие-то действия одновременно. У нас есть некоторая базовая защита — транзакции MySQL, некоторые двойные щелчки, предотвращающие Javascript, но в любом случае иногда что-то просто пропускает. Конечно, лучше всего было бы перепроектировать все SQL-транзакции и вспомогательные функции таким образом, чтобы не запутать систему. Одним из примеров такой путаницы является одновременная выдача двух обновлений: один веб-запрос изменяет что-то в базе данных, но второй запрос все еще работает со старыми данными, и поэтому обновление SQL возвращает «количество затронутых строк равно нулю», потому что первая транзакция уже изменилась. данные в БД. Очевидное решение состоит в том, чтобы прочитать данные еще раз прямо перед ОБНОВЛЕНИЕМ, чтобы увидеть, нуждаются ли они в обновлении, но это означает, что нужно помещать гораздо больше двойных запросов SELECT везде, а не хорошее решение - зачем читать одни и те же данные из БД дважды? Кроме того, мы рассмотрели возможность использования некоторого скрытого токена для сравнения на сервере при каждом запросе на обновление и запрете операций, которые имеют один и тот же идентификатор токена, но это также означает касание очень многих мест кода и, возможно, внесение новых ошибок в систему, которая работает отлично, за исключением это одна проблема.
Логика потока действий будет следующей: если пользователь выдал два запроса одновременно, второй запрос должен дождаться завершения первого. Но мы также должны учитывать, что в нашем приложении есть много перенаправлений (например, после POST, чтобы избежать двойного POST, когда пользователь обновляет страницу), поэтому решение не должно создавать взаимоблокировки для пользователя.
Итак, вопрос: что было бы самым простым из возможных глобальных исправлений, которые могли бы каким-то образом сделать все пользовательские операции последовательными? Есть ли хорошее универсальное решение?
Мы используем MySQL и PHP.