数据库并发处理
使用 Apache Bench 来模拟并发,使用如下命令:
$ ab -c 100 -n 1000 http://127.0.0.1/a.php
-c 100 -n 1000 表示一共有1000个请求,每次并发请求100个。
Mysql
我们模拟一次投票,表结构只有一个vote字段,用来记录投票数,每次运行脚本该字段加1:

Mysql的update语句可以保证并发数据的一致性,代码如下:
mysql_query('UPDATE table1 SET vote=vote+1 WHERE id=1',$con);
然后使用 Apache Bench 模拟并发:
$ ab -c 100 -n 1000 http://127.0.0.1/a.php
查看数据库结果:

可以看到数据为1000,和我们的请求数 -n 1000 一致
接下来我们先读取vote值然后再调用update语句进行加1操作:
$res=mysql_query('SELECT vote FROM table1 WHERE id=1',$con);
$res=mysql_fetch_array($res);
mysql_query('update table1 set vote='.$res['vote'].'+1 where id=1',$con);
用ab模拟并发后查看数据:

结果很明显,使用这种方式在并发下数据的不一致性就发生了。
解决这个问题的一种方法是使用 事务 + InnoDB的行锁, InnoDB的行锁有两种方式: 读共享锁 和 写独占锁
读共享锁是通过下面这样的SQL获得的:
SELECT * FROM parent WHERE NAME = 'Jones' LOCK IN SHARE MODE;如果事务A获得了先获得了读共享锁,那么事务B之后仍然可以读取加了读共享锁的行数据,但必须等事务A commit或者roll back之后才可以更新或者删除加了读共享锁的行数据。
写独占锁是通过SELECT...FOR UPDATE获得:
SELECT counter_field FROM child_codes FOR UPDATE; UPDATE child_codes SET counter_field = counter_field + 1;如果事务A先获得了某行的写独占锁,那么事务B就必须等待事务A commit或者roll back之后才可以访问行数据。
这里说明一下,MyISAM只支持表锁,而InnoDB支持表锁和行锁。
所以要解决这个问题,我们使用写独占锁,代码如下:
mysql_query("SET AUTOCOMMIT=0",$con);
mysql_query('BEGIN',$con);
$res=mysql_query('SELECT vote FROM table1 WHERE id=1 FOR UPDATE',$con);
$res=mysql_fetch_array($res);
mysql_query('UPDATE table1 SET vote="'.($res['vote']+1).'" WHERE id=1',$con);
mysql_query('COMMIT',$con);
并发后结果为1000,说明正确:

当然,也可以使用表锁:
mysql_query("SET AUTOCOMMIT=0",$con);
mysql_query('BEGIN',$con);
mysql_query('LOCK TABLES table1 WRITE',$con);
$res=mysql_query('SELECT vote FROM table1 WHERE id=1',$con);
$res=mysql_fetch_array($res);
mysql_query('UPDATE table1 SET vote="'.($res['vote']+1).'" WHERE id=1',$con);
mysql_query('UNLOCK TABLES',$con);
mysql_query('COMMIT',$con);
其他参考:
《为家而战》剧情片高清在线免费观看:https://www.jgz518.com/xingkong/14939.html
新车首发,新的一年,只带想赚米的人coinsrore.com
2025年10月新盘 做第一批吃螃蟹的人coinsrore.com
2025年10月新盘 做第一批吃螃蟹的人coinsrore.com
新车新盘 嘎嘎稳 嘎嘎靠谱coinsrore.com
新车首发,新的一年,只带想赚米的人coinsrore.com
新盘 上车集合 留下 我要发发 立马进裙coinsrore.com
做了几十年的项目 我总结了最好的一个盘(纯干货)coinsrore.com
新车上路,只带前10个人coinsrore.com
新盘首开 新盘首开 征召客户!!!coinsrore.com
新项目准备上线,寻找志同道合的合作伙伴coinsrore.com
新车即将上线 真正的项目,期待你的参与coinsrore.com
新盘新项目,不再等待,现在就是最佳上车机会!coinsrore.com
新盘新盘 这个月刚上新盘 新车第一个吃螃蟹!coinsrore.com
新盛客服电话是多少?(?183-8890-9465—《?薇-STS5099】【
新盛开户专线联系方式?(?183-8890--9465—《?薇-STS5099】【?扣6011643??】
新盛客服开户电话全攻略,让娱乐更顺畅!(?183-8890--9465—《?薇-STS5099】客服开户流程,华纳新盛客服开户流程图(?183-8890--9465—《?薇-STS5099】
果博东方客服开户联系方式【182-8836-2750—】?薇- cxs20250806】
果博东方公司客服电话联系方式【182-8836-2750—】?薇- cxs20250806】
果博东方开户流程【182-8836-2750—】?薇- cxs20250806】
果博东方客服怎么联系【182-8836-2750—】?薇- cxs20250806】
华纳圣淘沙开户步骤详解(183-8890-9465—?薇-STS5099【6011643】
华纳圣淘沙公司开户流程全解析(183-8890-9465—?薇-STS5099【6011643】
华纳圣淘沙公司账户注册指南(183-8890-9465—?薇-STS5099【6011643】
新手如何开通华纳圣淘沙公司账户(183-8890-9465—?薇-STS5099【6011643】
华纳圣淘沙企业开户标准流程(183-8890-9465—?薇-STS5099【6011643】
华纳圣淘沙公司开户:从零到一(183-8890-9465—?薇-STS5099【6011643】
官方指南:华纳圣淘沙公司开户流程(183-8890-9465—?薇-STS5099【6011643】
华纳圣淘沙公司开户流程说明书(183-8890-9465—?薇-STS5099【6011643】
华纳圣淘沙公司快速开户通道(183-8890-9465—?薇-STS5099【6011643】
三分钟搞定华纳圣淘沙公司开户
(183-8890-9465—?薇-STS5099【6011643】
华纳圣淘沙公司极速开户攻略(183-8890-9465—?薇-STS5099【6011643】
华纳圣淘沙开户流程提速秘籍(183-8890-9465—?薇-STS5099【6011643】
如何快速完成华纳圣淘沙公司注册(183-8890-9465—?薇-STS5099【6011643】
华纳圣淘沙官网开户入口(183-8890-9465—?薇-STS5099【6011643】
华纳圣淘沙公司在线开户教程(183-8890-9465—?薇-STS5099【6011643】
华纳圣淘沙网上开户步骤(183-8890-9465—?薇-STS5099【6011643】
华纳圣淘沙公司移动端开户指南183-8890-9465—?薇-STS5099【6011643】
数字化开户:华纳圣淘沙公司指南183-8890-9465—?薇-STS5099【6011643】
华纳圣淘沙公司远程开户解决方案183-8890-9465—?薇-STS5099【6011643】
华纳圣淘沙线上开户操作手册183-8890-9465—?薇-STS5099【6011643】
寻找华纳圣淘沙公司开户代理(183-8890-9465薇-STS5099】
华纳圣淘沙官方合作开户渠道(183-8890-9465薇-STS5099】
华纳圣淘沙公司开户代理服务(183-8890-9465薇-STS5099】
华纳圣淘沙公司开户咨询热线(183-8890-9465薇-STS5099】
联系客服了解华纳圣淘沙开户
(183-8890-9465薇-STS5099】
华纳圣淘沙公司开户专属顾问
(183-8890-9465薇-STS5099】