应用场景:高并发时下单,或者对某一表进行操作
如:某表中有一个数字为100,现在多人同时进行取出,-1,存回,假设有一百个人同时执行一次,我们预期的结果是0(低并发下),但事实上运行的结果却是99
MYSQL中的锁
同一时间只有一个人可以获取锁,其他人只能阻塞等待第一个人释放锁。
LOCKTABLE 表名 read|write;
UNLOCKTABLES;
Read:所有人都只可以读,只有释放锁之后才可以写
Write:只有锁表的客户可以操作这个表,其他客户读都不能读。
注意:在锁表过程中只能操作锁定的表,如果要操作其他表,需要都锁起来!。
同时锁定多张表:LOCK TABLE 表名1 read|write, 表2 read|write, 表3 read|write…..
缺点:阻塞。有些功能需要锁多张表,而有些表整个网站都要用,一旦锁定,会让整个网站处在阻塞状态。
PHP中的锁
特点:非阻塞。对表没有任何压力,所以实际应用使用这种比较好
<?php
namespace classes;
class Helper
{
private static $_lockFp = array();
public static function startLock($lockFileName)
{
self::$_lockFp[$lockFileName] = $fp = fopen(ROOT . '/data/lock/'.$lockFileName, 'r');//文件锁
if(!$fp)
return FALSE;
$try = 10;//试十次,避免一直死循环
$lock = false;
do
{
$lock = flock($fp, LOCK_EX);
if(!$lock)
usleep(50000); // 休息0.05秒,减轻cpu压力,usleep单位是微秒
}while(!$lock && --$try > 0);
return $lock;
}
public static function endLock($lockFileName)
{
if(isset(self::$_lockFp[$lockFileName]))
{
@flock(self::$_lockFp[$lockFileName], LOCK_UN);
@fclose(self::$_lockFp[$lockFileName]);
}
}
}
- 相关文章
- 大型网站及面临的问题及解决方法
- 网页静态化
- thinkphp网页静态化
- sphinx全文索引
- 海量订单数据存储方法
- 高并发时商品库存处理方法
- 高并发测试及系统状态监测
- PHP解决抢购、秒杀、抢楼、抽奖等
- php多线程例子
- php上传到七牛
- 热门文章
- win7中将文件拷贝到虚拟机linux下
- phpexcel设置行高及列宽,背景颜色,
- rabbitmq无法启动
- intellij idea不显示git push按钮
- php7中使用mongodb的aggregate进行
- centos7.4 64位下swoole安装及配置
- laravel页面静态化的方法
- navicate连接mycat报1184错误
- 单点登录sso原理及php实现方式及de
- devops-jenkins容器为pending状态
- 好评文章
- phpexcel设置行高及列宽,背景颜色,
- php7中使用mongodb的aggregate进行
- intellij idea打开文件所在文件夹
- windows下使用MongoDB Compass Com
- win7中将文件拷贝到虚拟机linux下
- laravel 中悲观锁 & 乐观锁的使用
- 单点登录sso原理及php实现方式及de
- navicate连接mycat报1184错误
- rabbitmq无法启动
- laravel整合dingo/api方法步骤:jwt
- 我的项目
- 【github】www.github.com/hurong241
- 【码云】gitee.com/hu_rong/projects
- 【docker hub】hub.docker.com/repositories/hurong241
- 【packagist】packagist.org/users/hurong241/packages
- 站点信息
- 建站时间:2011年
- 文章数:607篇
- 浏览数:938423