Для браузерной игры у меня есть таблица базы данных Борьба :
- fightID
- fromID
- toID
- смоделировано (1 = истина, 0 = ложь)
Всякий раз, когда пользователь запрашивает страницу, я выбираю все бои, которые еще должны быть смоделированы :
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
Проблема :
Представьте, как два пользователя приходят на страницу один за другим всего за несколько миллисекунд. На странице загрузки обоих пользователей выбираются одинаковые выдающиеся бои. Затем они моделируются и - поскольку оба запрашивают страницу почти одновременно - победитель получает свои очки дважды. Бои затем помечены как смоделированные. Но это слишком поздно.
Как мне избежать этой проблемы? Большое спасибо!