apache模拟高并发

用apache模拟一次一万的并发量  如果不采取任何措施 测试后表最终少误差在15

经查阅资料

用mysql表锁和文件锁两种方式都可以保证表数据准确性

表锁:

ini_set('display_errors',1); 
ini_set('display_startup_errors',1); 
error_reporting(E_ALL & ~E_NOTICE);
$link=mysqli_connect('localhost','123','123','test');

mysqli_query($link,"lock table bingfa write");

if ($result = mysqli_query($link,"SELECT id,num FROM bingfa WHERE del!=1 and name='goods1'")){
    while($row = mysqli_fetch_assoc($result) ){
        $id=$row['id'];
        $num=$row['num'];
    }
}
//print_r($row);
$num--;

$f=mysqli_query($link,"UPDATE bingfa SET num=".$num." WHERE id=".$id."");

mysqli_query($link,"unlock tables");

mysqli_close($link);

Apache ab反馈总用时121.26s

文件锁
$link=mysqli_connect('localhost','123','123','test');

$file=fopen('./test.js','r');//任意一存在的文件即可
flock($file,LOCK_EX);

if ($result = mysqli_query($link,"SELECT id,num FROM bingfa WHERE del!=1 and name='goods1'")){
    while($row = mysqli_fetch_assoc($result) ){
        $id=$row['id'];
        $num=$row['num'];
    }
}
//print_r($row);
$num--;

$f=mysqli_query($link,"UPDATE bingfa SET num=".$num." WHERE id=".$id."");

flock($file,LOCK_UN);
fclose($file);

mysqli_close($link);

Apache ab反馈总用时136.79s

文件锁要比表锁慢用时长一点,但是表锁要把所有涉及本操作的表锁定,直接操作数据库造成堵塞容易拖慢整个项目,本着尽量少去操作数据库的原则还是文件锁好一点,除非项目中只需要锁定这一个表。

表锁资料:

mysql中的锁                                                                                                               
语法:LOCK TABLE 表名1  READ|WRITE, 表名2 READ|WRTIE.....

解锁:UNLOCK TABLES;

read:读锁(共享锁):如果以这种方式锁定表,那么在锁定的过程中所有客户端只有读这张表的权限,并且该客户端不能操作其他表。

write:写锁(排它锁):如果以这种方式锁定表,那么只有锁定这个表的客户端可以操作这张表,其他客户端不能操作个表直到锁释放为止。

猜你喜欢

转载自blog.csdn.net/u010433704/article/details/88666701