如何处理PHP高并发下数据库值更新的问题
2022-05-31PHP
如何处理PHP高并发下数据库值更新的问题 . 数据库高并发处理 , 如何处理数据库并发 , 数据库并发处理机制
一、创建一个测试数据库test ,创建商品表goods(字段id,total),商品id是1,商品总数10
CREATE TABLE `goods` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `total` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; INSERT INTO `goods` VALUES ('1', '10');
二、PHP模拟秒杀购买,商品数量大于0才能购买
<?php $dbms = 'mysql'; //数据库类型 $host = '127.0.0.1'; //数据库主机名 $dbName = 'test'; //使用的数据库 $user = 'root'; //数据库连接用户名 $pass = ''; //对应的密码 $dsn = "$dbms:host=$host;dbname=$dbName"; try { $pdo = new PDO($dsn, $user, $pass); //初始化一个PDO对象 echo "连接成功<br/>"; // 查询id为1的记录 $select_sql = "SELECT total FROM goods WHERE id=1 LIMIT 1"; $result = $pdo->query($select_sql); $res = $result->fetch(); if($res['total']>0){ $update_sql = "UPDATE goods SET total=total-1 WHERE id=1"; $pdo->query($update_sql); } $pdo = null; } catch (PDOException $e) { die ("Error!: " . $e->getMessage() . "<br/>"); } //默认这个不是长连接,如果需要数据库长连接,需要最后加一个参数:array(PDO::ATTR_PERSISTENT => true) 变成这样: $db = new PDO($dsn, $user, $pass, array(PDO::ATTR_PERSISTENT => true));
三、ab.exe工具进行高并发测试
命令:
ab -n 500 -c 500 http://web.whm.com/concurrency.php
压力测试:
压力测试是一种基本的质量保证行为,它是每个重要软件测试工作的一部分。压力测试的基本思路很简单:不是在常规条件下运行手动或自动测试,而是在计算机数量较少或系统资源匮乏的条件下运行测试。通常要进行压力测试的资源包括内部内存、CPU 可用性、磁盘空间和网络带宽等。一般用并发来做压力测试。
压力测试工具:webbench,ApacheBench(如上,简称ab)等
四、运行后的结果
商品数量出现了负数,显然,在高并发的情况下,代码这样写是有问题的
很赞哦! ()