通常在商城抢购时,会遇到高并发的情况,一般大部分是使用mysql的锁机制来处理,首先给mysql加个排它锁,然后在执行完其它逻辑运算时,再将这个锁放开,下一个客户端来执行。lock table 表名 write;
....
unlock tables
这种方法一个弊端是表一旦被锁定,其它需要读取数据时,必须要等待解锁才能执行,这对于较大的访问显然不太友好,那么还有什么比较好的解决方案吗?答案是有,那就是用php的文件锁来实现。
下面直接上代码,可以用apache自带的一个压力测试ab.exe来模拟一下高并发的情况,php的代码如下:$file = fopen('a.lock', 'r');
//开户锁
flock($file, LOCK_EX);
try {
$dsn = 'mysql:host=localhost;dbname=jeecms';
$username = 'root'; // 数据库用户名
$passwd = '123456'; // 数据库密码
$pdo = new PDO($dsn, $username, $passwd, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES UTF8"));
$sql = "SELECT click FROM jee_test WHERE id > 0";
$result = $pdo->query($sql);
$row = $result->fetch(PDO::FETCH_ASSOC);
//var_dump($row);
//exit;
$click = intval($row['click']);
$click--;
unset($sql);
$sql = "UPDATE jee_test SET click = {$click}";
$pdo->exec($sql);
echo '抢购成功....';
} catch (PDOException $e) {
echo $e->getMessage();
}
//解锁
flock($file, LOCK_UN);
fclose($file);