thinkPHP框架乐观锁和悲观锁实例分析


Posted in PHP onOctober 30, 2019

本文实例讲述了thinkPHP框架乐观锁和悲观锁。分享给大家供大家参考,具体如下:

乐观锁:

例子对于一个正在出售的火爆商品,同一个时间,同时有10个人同时发起了10个线程来购买,10个线程读取到数据库的库存有20件和version为9。

那么乐观锁读取num数量和version版本两个字段,在更新的结果时候,我们就要更新条件where version=9这条语句,具体UPDATE goods SET num=num-1,version=version+1 WHERE version=9 and id=1,这样的话,如果其中一条执行成功后,数据库中version的值为10了,所以剩下的9个人线程都会失败了。

$result = $this->mysqli->query("SELECT num,version FROM goods WHERE id=1 LIMIT 1");
$row = $result->fetch_assoc();
$num = intval($row['num']);
$version = intval($row['version']);
if($num > 0){
  usleep(100);
  $this->mysqli->begin_transaction();
  $this->mysqli->query("UPDATE goods SET num=num-1,version=version+1 WHERE version={$version} and id=1");
  $affected_rows = $this->mysqli->affected_rows;
  if($affected_rows == 1){
    $this->mysqli->query("INSERT INTO log(good_id) VALUES({$num})");
    $affected_rows = $this->mysqli->affected_rows;
    if($affected_rows == 1){
      $this->mysqli->commit();
      echo "success:".$num;
    }else{
      $this->mysqli->rollback();
      echo "fail1:".$num;
    }
  }else{
    $this->mysqli->rollback();
    echo "fail2:".$num;
  }
}else{
  echo "fail3:".$num;
}

乐观锁缺点:

  • 比如可能别人先购买的,反而后面的先买到了,这就点不太合理

乐观锁优点:

  • 这可以避免超发的现象发生

悲观锁mysql代码:

#主要对所在行进行for update
select * from employee where id = 1 for update; 
update employee set money = 0 + 1 where id = 1;

参考链接:
https://www.kancloud.cn/mikkle/thinkphp5_study/359349

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

PHP 相关文章推荐
编译问题
Oct 09 PHP
php minixml详解
Jul 19 PHP
PHP通过session id 实现session共享和登录验证的代码
Jun 03 PHP
php从数组中随机抽取一些元素的代码
Nov 05 PHP
php小经验:解析preg_match与preg_match_all 函数
Jun 29 PHP
CI框架开发新浪微博登录接口源码完整版
May 28 PHP
PHP向浏览器输出内容的4个函数总结
Nov 17 PHP
PHP遍历目录函数opendir()、readdir()、closedir()、rewinddir()总结
Nov 18 PHP
PHP中Session和Cookie是如何操作的
Oct 10 PHP
thinkPHP实现将excel导入到数据库中的方法
Apr 22 PHP
PHP获取网站中各文章的第一张图片的代码示例
May 20 PHP
PHP实现求解最长公共子串问题的方法
Nov 17 PHP
PHP的HTTP客户端Guzzle简单使用方法分析
Oct 30 #PHP
ThinkPHP5.0框架实现切换数据库的方法分析
Oct 30 #PHP
Laravel 中使用简单的方法跟踪用户是否在线(推荐)
Oct 30 #PHP
微信小程序发送订阅消息的方法(php 为例)
Oct 30 #PHP
php上传后台无法收到数据解决方法
Oct 28 #PHP
PHP常见的序列化与反序列化操作实例分析
Oct 28 #PHP
PHP接入微信H5支付的方法示例
Oct 28 #PHP
You might like
yii上传文件或图片实例
2014/04/01 PHP
使用PHP进行微信公众平台开发的示例
2015/08/21 PHP
Laravel 自带的Auth验证登录方法
2019/09/30 PHP
新浪刚打开页面出来的全屏广告代码
2007/04/02 Javascript
setTimeout 不断吐食CPU的问题分析
2009/04/01 Javascript
script标签的 charset 属性使用说明
2010/12/04 Javascript
jquery 检测元素是否存在的实例代码
2013/11/19 Javascript
Bootstrap开关(switch)控件学习笔记分享
2016/05/30 Javascript
javascript使用 concat 方法对数组进行合并的方法
2016/09/08 Javascript
Angular简单验证功能示例
2017/12/22 Javascript
JS实现网站吸顶条
2020/01/08 Javascript
openlayers实现地图测距测面
2020/09/25 Javascript
element-ui点击查看大图的方法示例
2020/12/14 Javascript
使用Python的Tornado框架实现一个简单的WebQQ机器人
2015/04/24 Python
在Python中用keys()方法返回字典键的教程
2015/05/21 Python
python斐波那契数列的计算方法
2018/09/27 Python
详解python中递归函数
2019/04/16 Python
Python facenet进行人脸识别测试过程解析
2019/08/16 Python
pytorch实现对输入超过三通道的数据进行训练
2020/01/15 Python
python GUI库图形界面开发之PyQt5线程类QThread详细使用方法
2020/02/26 Python
Python+Django+MySQL实现基于Web版的增删改查的示例代码
2020/05/13 Python
python进度条显示之tqmd模块
2020/08/22 Python
Python调用SMTP服务自动发送Email的实现步骤
2021/02/07 Python
四年大学自我鉴定
2014/02/17 职场文书
2014信息公开实施方案
2014/02/22 职场文书
给学校的建议书
2014/03/12 职场文书
代领毕业证委托书
2014/08/02 职场文书
租房安全协议书
2014/08/20 职场文书
课内比教学心得体会
2014/09/09 职场文书
员工表扬信怎么写
2015/05/05 职场文书
植物园观后感
2015/06/11 职场文书
十八大观后感
2015/06/12 职场文书
家庭贫困证明
2015/06/16 职场文书
详解Java ES多节点任务的高效分发与收集实现
2021/06/30 Java/Android
面试分析分布式架构Redis热点key大Value解决方案
2022/03/13 Redis
Win11跳过联网界面创建本地管理账户的3种方法
2022/04/20 数码科技