本文最后更新于 1748 天前,其中的信息可能已经有所发展或是发生改变。
什么是并发?
并发,计算机网络术语,是指同时访问服务器站点的连接数。
由于虚拟主机是建立在每台服务器多用户的基础上的,也就是多个用户共同使用一台服务器。为了避免同一台服务器上的某一个用户的IIS链接人数过多或占用服务器资源过多而影响其它用户的正常使用。
所以,目前所有虚拟空间提供商都对单个用户的IIS链接数,流量及服务器进程占用CPU的比率进行了相应的限制。 当某一个用户的站点超出了服务器上的设制后,访问站点时就会出现服务器忙,或目前访问该站点的人数过多,超出了WEB的处理能力等相关错误提示。
简单说
就是在同一秒内,500个用户同时进行操作,服务器执行不过来,这时候就需要并发和锁的处理了
如:500个用户同时购买A商品,这时候需要向数据库请求减少库存并增加订单
那么同时处理的话,数据库肯定处理不过来,有可能A商品的库存只会减少1个
这是很验证的
怎么处理?
我们可以用到事务处理,加锁。
简单说
就是每个用户上一把属于他们的锁,但用户1订单处理完,再处理用户2,如果处理失败就执行回滚
TP5怎么处理?
我们假设一个数据库表为:test,且保证每个用户同时只能插入一条
表中含有字段
字段 | 说明 |
---|---|
id | 自增Int(假设用户账户) |
age | 年龄(假设的数据) |
首先,我们先试试下面这个没有结果加锁处理的代码
public function test()
{
Db::startTrans(); // 启动事务
try {
$res = db('test')->find();
if (!$res) {
//执行你想进行的操作, 最后返回操作结果 result
Db::name('test')->insert(array('age'=>20));
$result = true;
if (!$result) {
db('test')->rollback();//回滚
}
}
Db::commit();
} catch (\Exception $e) {
// 回滚事务
Db::rollback();
}
}
然后我们用Apache的测压工具AB来执行并发测试
(可以百度搜索:ab并发测试工具)
请求数10,并发数5
ab -n 10 -c 5 http://bf.com/index/index/test
这时候,数据库多了5条记录
[图片已丢失]
那么我们来试一下加锁
,先把表里的数据清空,然后用下面这个代码
public function test()
{
Db::startTrans(); // 启动事务
try {
$res = db('test')->lock(true)->where('id', '>', 1)->find();//这里可以自定义
if (!$res) {
//执行你想进行的操作, 最后返回操作结果 result
Db::name('test')->insert(array('age' => 1));
$result = true;
if (!$result) {
db('test')->rollback();//回滚
}
}
Db::commit();
} catch (\Exception $e) {
// 回滚事务
Db::rollback();
}
}
注意,里面的lock就是TP5的锁
然后我们再AB一下
接下来看看数据库
就一个数据咯
是不是很简单?很好理解?
今天的教程结束
有什么疑问可以评论在下方哦,我每天都会回的