Для игры браузера, у меня есть таблица базы данных бои:PHP/MySQL: Предотвращение повторяющихся действий быстро подряд
- fightID
- fromID
- toID
- моделировали (1 = истина , 0 = false)
Всякий раз, когда пользователь запрашивает страницу, I выбирает al л бои, которые еще должны быть смоделированы:
SELECT fightID, fromID, toID FROM fights WHERE simulated = 0
Эти выдающиеся бои затем моделируется в PHP скрипт и, наконец, бой отмечен как моделируется и победитель получает его очки:
UPDATE fights SET simulated = 1 WHERE fightID = X
UPDATE users SET points = points+1 WHERE userID = WINNER
проблема:
Представьте два пользователя приходят на страницу один за другим всего за несколько миллисекунд. На загрузке обеих пользователей выбраны одинаковые выдающиеся бои. Затем они моделируются и - поскольку оба запрашивали страницу почти одновременно - победитель получает свои очки дважды. Бои - , затем обозначены как моделированные. Но это уже слишком поздно.
Как я могу избежать этой проблемы? Большое спасибо!
+1 для транзакций, для чего они предназначены. Но я не понимаю вашего оговорки об уходе пользователя; для чего нужны откаты. –
Я знаю, что такое откат;). Но предположим, что исход боя вычисляется на стороне сервера, а затем отображается на стороне клиента с использованием флэш-анимации. Возможно, что пользователь не наблюдает за всеми боями, что может означать, что невидимый бой отменен. Я не вижу, как можно отменить часть транзакции в другом запросе (я также не вижу, как вы можете обнаружить, что пользователь уходит и отправляет этот последний запрос, если на то пошло). – Wookai
Большое спасибо! Вы могли бы избежать проблемы с уходом пользователя, просто используя ignore_user_abort (true), не так ли? – caw