我最近一直在做一些PHP的web开发工作,这让我开始学习这门语言。到目前为止,我还不需要使用它来与数据库交互,但我知道它提供了许多方便的函数来这样做。
虽然我知道基本的SQL,并使用过数据库中数据的基本操作,但我不明白基于PHP/Javascript/SQL的网站开发人员如何能够管理同时修改相同数据的用户。
例如,假设你有一个21点的网站,当用户注册时,它将用户分为两个团队之一。每次用户赢得一场比赛,他们的赢利的一部分将被添加到该团队的运行总数中。
因此,假设执行此操作的函数的伪代码如下所示:
...
$total = mysql_query("SELECT score FROM team1");
$total = $total + $mytotal;
mysql_query("UPDATE team1 SET score='".$total."'");
...
如果两个玩家同时玩游戏,他们很可能会在另一个玩家有机会递增和更新表之前调用SELECT,因此其中一个用户的更改将立即被覆盖。
我的问题是,如何避免这种情况?这是在代码级别使用PHP完成的吗,或者您正在使用的数据库提供的功能是否有助于防止这种情况发生?
我做了一些研究,似乎PHP确实提供了一个semaphore机制,我也注意到mysql提供了一个LOCK table feature。但是,我不确定这两种方法中的哪一种在实践中使用。
发布于 2009-11-11 11:55:12
如果您的实际问题比这个简单的示例更大,那么您应该结合使用事务和锁表,以确保用户不会互相覆盖。
发布于 2009-11-11 11:45:08
将逻辑放在数据库中,这些语义基本上已经为您解决了。
update teams
set score = score + 1
where team_id = 1
。。或者其他比分和队号。
发布于 2009-11-11 11:56:17
主要数据库就是为处理这种情况而设计的。
在使用MySQL时,InnoDB存储引擎具有行锁定功能,该功能可锁定正在写入的行。因此,任何针对同一行的update请求都将等待,直到该行上的上一个操作完成。
如果使用MyISAM存储引擎,则在更新行时会锁定整个表。当多个玩家同时推送更新请求时,这会在服务器上造成阻塞。因此,这一切都是关于什么数据库,特别是什么存储引擎,您正在使用的目的。
https://stackoverflow.com/questions/1712860
复制相似问题