首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PHP和并发性

PHP和并发性
EN

Stack Overflow用户
提问于 2009-11-11 11:40:28
回答 7查看 9.6K关注 0票数 7

我最近一直在做一些PHP的web开发工作,这让我开始学习这门语言。到目前为止,我还不需要使用它来与数据库交互,但我知道它提供了许多方便的函数来这样做。

虽然我知道基本的SQL,并使用过数据库中数据的基本操作,但我不明白基于PHP/Javascript/SQL的网站开发人员如何能够管理同时修改相同数据的用户。

例如,假设你有一个21点的网站,当用户注册时,它将用户分为两个团队之一。每次用户赢得一场比赛,他们的赢利的一部分将被添加到该团队的运行总数中。

因此,假设执行此操作的函数的伪代码如下所示:

代码语言:javascript
运行
复制
... 
$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。但是,我不确定这两种方法中的哪一种在实践中使用。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-11-11 11:55:12

如果您的实际问题比这个简单的示例更大,那么您应该结合使用事务和锁表,以确保用户不会互相覆盖。

票数 5
EN

Stack Overflow用户

发布于 2009-11-11 11:45:08

将逻辑放在数据库中,这些语义基本上已经为您解决了。

代码语言:javascript
运行
复制
update teams
set score = score + 1
where team_id = 1

。。或者其他比分和队号。

票数 11
EN

Stack Overflow用户

发布于 2009-11-11 11:56:17

主要数据库就是为处理这种情况而设计的。

在使用MySQL时,InnoDB存储引擎具有行锁定功能,该功能可锁定正在写入的行。因此,任何针对同一行的update请求都将等待,直到该行上的上一个操作完成。

如果使用MyISAM存储引擎,则在更新行时会锁定整个表。当多个玩家同时推送更新请求时,这会在服务器上造成阻塞。因此,这一切都是关于什么数据库,特别是什么存储引擎,您正在使用的目的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1712860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档