Я пишу стратегию многопользовательской игры для Интернета. В нем есть игровое поле (X по квадратам Y), которое я планирую сериализовать и хранить в BLOB в базе данных MySQL (innodb), по одной строке для каждой текущей игры.Достаточно ли этого, или у меня есть условия гонки?
Теперь я попытаюсь найти хороший способ сохранить базу данных обновленной с любыми изменениями в игровом поле и в то же время найти удобное решение, как обрабатывать вещи, которые происходят с игровым полем в промежутках времени между загрузкой страницу и фактически сделать ход.
Я не использую AJAX.
В каждой игре будет не более 20 игроков, каждый игрок делает от 1 до 10 ходов за 24 часа, поэтому это «медленная» игра.
Мой план (пока) заключается в том, чтобы также хранить контрольную сумму для игрового поля рядом с блобом и сравнивать состояние базы данных с загруженным состоянием, прежде чем пытаться внести изменения в игровое поле.
О чем беспокоиться - как предотвратить условия гонки.
Является ли это достаточно, чтобы:
- Начало транзакции. игровое поле
- груза из таблицы
- если контрольная сумма отличается - откат и обновления пользователей просматривать
- если контрольная сумма без изменений - таблица обновления и совершающих изменения
ли BEGIN TRANSACTION
достаточно, чтобы блокировать гонки, или я нужно сделать что-то еще на шаге 2, чтобы показать мое намерение обновить таблицу?
Благодарен за все советы.
Отлично. Является ли мой «алгоритм» здоровым? Я имею в виду, что я гарантирую, что два (или любое число) потоков, которые одновременно выполняют 2 шага выше (с 'FOR UPDATE'), будут сериализованы, так что только один процесс за один раз может получить доступ к соответствующей строке? – MattBianco
Да, когда один поток выдает SELECT FOR UPDATE в строке, все остальные потоки останавливаются на их SELECT FOR UPDATE, пока эта транзакция не будет завершена. Затем следующий поток, который пройдет, прочитает обновленную строку. – nathan