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 相关文章推荐
在任意字符集下正常显示网页的方法二(续)
Apr 01 PHP
php中关于codeigniter的xmlrpc的类在进行数据交换时的类型问题
Jul 03 PHP
PHP 抽象方法与抽象类abstract关键字介绍及应用
Oct 16 PHP
php匹配字符中链接地址的方法
Dec 22 PHP
详解PHP序列化反序列化的方法
Oct 27 PHP
weiphp微信公众平台授权设置
Jan 04 PHP
laravel5.4生成验证码的实例讲解
Aug 05 PHP
php插件Xajax使用方法详解
Aug 31 PHP
php-msf源码详解
Dec 25 PHP
PHP常见字符串操作函数与用法总结
Mar 04 PHP
PHP实现无限极分类的两种方式示例【递归和引用方式】
Mar 25 PHP
Thinkphp集成抖音SDK的实现方法
Apr 28 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
无限级别菜单的实现
2006/10/09 PHP
深入理解PHP之数组(遍历顺序)  Laruence原创
2012/06/13 PHP
php中长文章分页显示实现代码
2012/09/29 PHP
实用的简单PHP分页集合包括使用方法
2013/10/21 PHP
PHP获取本周第一天和最后一天示例代码
2014/02/24 PHP
自己写了一个php检测文件编码的函数
2014/04/21 PHP
Smarty模板简单配置与使用方法示例
2016/05/23 PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
2017/11/16 PHP
php使用fputcsv实现大数据的导出操作详解
2020/02/27 PHP
PJBlog插件 防刷新的在线播放器
2006/10/25 Javascript
动态控制Table的js代码
2007/03/07 Javascript
禁止JQuery中的load方法装载IE缓存中文件的方法
2009/09/11 Javascript
对xmlHttp对象方法和属性的理解
2011/01/17 Javascript
jQuery Tools tab(幻灯片)
2012/07/14 Javascript
Javascript实现真实字符串剩余字数提示的实例代码
2013/10/22 Javascript
javascript垃圾收集机制与内存泄漏详细解析
2013/11/11 Javascript
jQuery简单动画变换效果实例分析
2016/07/04 Javascript
javascript判断firebug是否开启的方法
2016/11/23 Javascript
很棒的一组js图片轮播特效
2017/01/12 Javascript
JavaScript与JQUERY获取元素的宽、高和位置
2017/02/26 Javascript
Node.js利用debug模块打印出调试日志的方法
2017/04/25 Javascript
详解swipe使用及竖屏页面滚动方法
2018/06/28 Javascript
写一个Vue loading 插件
2020/11/09 Javascript
[03:55]2014DOTA2国际邀请赛 Fnatic经理采访赢DK在情理之中
2014/07/10 DOTA
python 使用sys.stdin和fileinput读入标准输入的方法
2018/10/17 Python
keras中的backend.clip用法
2020/05/22 Python
Pytorch实验常用代码段汇总
2020/11/19 Python
css3实现超立体3D图片侧翻倾斜效果
2014/04/16 HTML / CSS
英国最大的宠物食品和宠物用品网上零售商: Zooplus
2016/08/01 全球购物
美体小铺奥地利官方网站:The Body Shop奥地利
2019/04/11 全球购物
Does C# support multiple inheritance? (C#支持多重继承吗)
2012/01/04 面试题
yy生日主持词
2014/03/20 职场文书
高三毕业典礼演讲稿
2014/05/13 职场文书
纪律教育学习心得体会
2014/09/02 职场文书
2015员工年度考核评语
2015/03/25 职场文书
MongoDB数据库部署环境准备及使用介绍
2022/03/21 MongoDB