Проблема с одновременными кликами от разных пользователей - PullRequest
0 голосов
/ 06 апреля 2011

У меня есть сайт, который позволяет пользователям присоединяться к «команде».Ограничение числа участников в команде определено в $maxPlayersPerTeam.

Когда пользователь щелкает ссылку, чтобы присоединиться к команде, этот код выполняется

//query to get players count
if ($players < $maxPlayersPerTeam) {
  // query to insert the player
}

Однако, если два пользователя нажимают ссылку присоединенияВ то же время оба могут присоединиться к команде, даже если $players равно $maxPlayersPerTeam.

Что я могу сделать, чтобы избежать этого?

Ответы [ 3 ]

1 голос
/ 06 апреля 2011

Вы должны получить блокировку на наборе данных (я надеюсь, что вы используете базу данных, верно?), Выполнить проверку и в конечном итоге обновить набор данных.Таким образом, если два человека действительно выполняют код одновременно, один из них должен ждать блокировки другого.После получения блокировки во второй раз, набор данных уже обновлен, и человек также не может присоединиться к вашей команде.

0 голосов
/ 06 апреля 2011

Предполагая, что вы используете базу данных для хранения информации, ваша система баз данных должна иметь метод для обработки транзакций и управления ими, который бы обслуживал события нескольких транзакций, происходящих одновременно (даже если это невероятно редкий случай) , На это есть статья в вики (даже если я не решаюсь дать ссылку на нее). http://en.wikipedia.org/wiki/Transaction_processing.

В MySQL есть методы для этого: http://dev.mysql.com/doc/refman/5.0/en/commit.html. Как и в PostgreSQL: http://www.postgresql.org/docs/8.3/static/tutorial-transactions.html.

0 голосов
/ 06 апреля 2011

Будьте счастливы, некоторые люди уже работали над проблемами такого рода и предлагают вам возможное решение: транзакции с базой данных .Лучше всего справиться с ними - использовать методы PDO и beginTransaction , commit и rollBack .

Ваши таблицыпридется использовать механизм базы данных, который принимает транзакции (поэтому innoDb вместо MyISAM).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...