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