我有一个允许用户加入“团队”的网站。该团队在$maxPlayersPerTeam
中定义了成员限制。
当用户点击链接加入团队时,此代码将被执行
//query to get players count
if ($players < $maxPlayersPerTeam) {
// query to insert the player
}
但是,如果两个用户同时点击了加入链接,即使$players
等于$maxPlayersPerTeam
,两者都可以加入该团队。
我该怎么做才能避免这种情况?
答案 0 :(得分:1)
您应该获取数据集上的锁(我希望您使用的是数据库,对吗?),执行检查并最终更新数据集。因此,如果两个人真正同时执行代码,则两个人中的一个必须等待另一个人的锁定。第二次获取锁定后,数据集已经更新,此人也无法加入您的团队。
答案 1 :(得分:0)
很高兴有些人已经解决过这类问题并为您提供了一些可能的解决方案:database transactions。 最好处理这些问题的方法是使用PDO及其beginTransaction,commit和rollBack方法。
您的表必须使用接受事务的数据库引擎(因此innoDb而不是MyISAM)。
答案 2 :(得分:0)
假设您正在使用数据库来存储信息,您的数据库系统应该具有事务处理和管理它们的方法,以满足同时发生的多个事务的事件(即使这是极其罕见的情况) 。有关于此的维基文章(即使我匆匆链接到它)。 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。