Достаточно ли этого или у меня есть условия гонки? - PullRequest
2 голосов
/ 24 августа 2010

Я пишу стратегическую многопользовательскую игру для Интернета. У него есть игровое поле (квадраты X по Y), которое я планирую сериализовать и сохранить в BLOB в базе данных MySQL (innodb), по одной строке для каждой продолжающейся игры.

Теперь я попытаюсь найти хороший способ обновления базы данных при любых изменениях игрового поля и в то же время найти удобное решение для того, как обрабатывать события, происходящие с игровым полем, в промежутке времени между загрузкой страница и фактически делает ход.
Я не использую AJAX.

В каждой игре будет не более 20 игроков, каждый из которых делает от 1 до 10 ходов в течение 24 часов, так что это «медленная» игра.

Мой план (на данный момент) также состоит в том, чтобы сохранить своего рода контрольную сумму для игрового поля рядом с BLOB-объектом и сравнить состояние баз данных с загруженным состоянием, прежде чем пытаться вносить изменения в игровое поле.

Что меня беспокоит, так это как предотвратить состояние гонки.
Достаточно ли:

  1. Начать транзакцию.
  2. загрузить игровое поле со стола
  3. если контрольная сумма отличается - откат и обновление представления пользователей
  4. если контрольная сумма не изменилась - обновить таблицу и зафиксировать изменения

Достаточно ли BEGIN TRANSACTION, чтобы заблокировать гонку, или мне нужно сделать что-то еще на шаге 2, чтобы показать свое намерение обновить таблицу?

Благодарен за все советы.

Ответы [ 2 ]

2 голосов
/ 24 августа 2010

Если вы используете SELECT ... FOR UPDATE при загрузке игрового поля из базы данных, он будет блокировать другие варианты выбора, пока вы не подтвердите или не откатите транзакцию.

0 голосов
/ 24 августа 2010

Нет. Вам нужно будет выполнить команду LOCK TABLES для таблиц, которые необходимо защитить от конфликтующих обновлений. Это будет выглядеть примерно так ...

LOCK TABLE my_table WRITE;

Более подробную информацию можно найти здесь ... http://dev.mysql.com/doc/refman/5.1/en/lock-tables.html

Не забудьте потом разблокировать их!

...