我写过使用文件锁来处理高并发问题。下面说说另外一种方案,利用Mysql锁来解决高并发问题。我们先看看不使用事务时并发的后果。创建库存管理表CREATETABLE`storage`(`id`int(11)unsignedNOTNULLAUTO_INCREMENT,`number`int(11)DEFAULTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=2DEFAULTCHARSET=latin1创建订单管理表CREATETABLE`order`(`id`int(11)unsignedNOTNULLAUTO_INCREMENT,`number`int(11)DEFAULTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=34DEFAULTCHARSET=latin1测试代码$pdo=newPDO('mysql:host=127.0.0.1;port=3306;dbname=test','root','123456');$sql="select`number`fromstoragewhereid=1limit1";$res=$pdo->query($sql)->fetch();$number=$res['number'];if($number>0){$sql="插入`order`值(空值,$数字)”;$order_id=$pdo->query($sql);if($order_id){$sql="更新存储集`number`=`number`-1WHEREid=1";$pdo->查询($sql);}}我们预设十只股票,然后执行ab测试查看结果mysql>select*fromstorage->;+----+--------+|ID|数字|+----+--------+|1|-2|+----+--------+1rowinset(0.00sec)mysql>select*from`order`;+----+--------+|编号|数字|+----+--------+|22|10||23|1024|8||25|8||26|7||27|6||28|4||29|3||30|2||31|2||32|2||33|1|+----+--------+12rowsinset(0.00sec)一共拿到了12个订单,库存表中的库存也减少到了-2,显然没有不符合实际逻辑;让我们看看使用数据库行锁来解决这个问题。修改代码如下$pdo=newPDO('mysql:host=127.0.0.1;port=3306;dbname=test','root','123456');$pdo->beginTransaction();//开启事务$sql="select`number`fromstoragewhereid=1forUPDATE";//用于更新开启行锁$res=$pdo->query($sql)->fetch();$number=$res['number'];if($number>0){$sql="insertinto`order`VALUES(null,$number)";$order_id=$pdo->query($sql);if($order_id){$sql="更新存储集`number`=`number`-1WHEREid=1";如果($pdo->查询($sql)){$pdo->提交();//提交事务}else{$pdo->rollBack();//回滚}}else{$pdo->rollBack();//回滚}}查看结果mysql>select*fromstorage;+----+------+|编号|数字|+----+--------+|1|0|+----+-------+1rowinset(0.00sec)mysql>select*from`order`;+----+--------+|编号|数字|+----+--------+|1|10||2|9||3|8||4|7||5|6||6|5||7|4||8|3||9|2||10|1|+----+--------+10rowsinset(0.00sec)显然,使用mysql锁后,库存得到了有效的控制,解决了第一块的问题代码,并发引起的一些逻辑问题
