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 相关文章推荐
Discuz! Passport 通行证整合
Mar 27 PHP
php adodb连接带密码access数据库实例,测试成功
May 14 PHP
PHP下编码转换函数mb_convert_encoding与iconv的使用说明
Dec 16 PHP
PHP读取XML值的代码(推荐)
Jan 01 PHP
PHP mcrypt可逆加密算法分析
Jul 19 PHP
php curl 伪造IP来源的实例代码
Nov 01 PHP
PHP网站开发中常用的8个小技巧
Feb 13 PHP
PHP开发框架laravel安装与配置教程
Mar 13 PHP
php不使用copy()函数复制文件的方法
Mar 13 PHP
Laravel 5.3 学习笔记之 错误&日志
Aug 28 PHP
PHP中include()与require()的区别说明
Feb 14 PHP
详解使用php调用微信接口上传永久素材
Apr 11 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
PHP 和 MySQL 基础教程(二)
2006/10/09 PHP
PHP UTF8编码内的繁简转换类
2009/07/20 PHP
PHP中date()日期函数有关参数整理
2011/07/19 PHP
支持中文和其他编码的php截取字符串函数分享(截取中文字符串)
2014/03/13 PHP
PHP文件操作之获取目录下文件与计算相对路径的方法
2016/01/08 PHP
JavaScript获取GridView中用户点击控件的行号,列号
2009/04/14 Javascript
asp.net刷新本页面的六种方法总结
2014/01/07 Javascript
JS数组去重与取重的示例代码
2014/01/24 Javascript
jQuery异步验证用户名是否存在示例代码
2014/05/21 Javascript
javascript中clone对象详解
2014/12/03 Javascript
推荐10 款 SVG 动画的 JavaScript 库
2015/03/24 Javascript
jQuery模拟黑客帝国矩阵效果实例
2015/06/28 Javascript
详解javascript传统方法实现异步校验
2016/01/22 Javascript
jquery获取table指定行和列的数据方法(当前选中行、列)
2016/11/07 Javascript
常用JS图片滚动(无缝、平滑、上下左右滚动)代码大全(推荐)
2016/12/20 Javascript
jquery获取下拉框中的循环值
2017/02/08 Javascript
详解webpack的proxyTable无效的解决方案
2018/06/15 Javascript
JavaScript变量Dom对象的所有属性
2020/04/30 Javascript
[59:59]EG vs IG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python中利用sorted()函数排序的简单教程
2015/04/27 Python
详解python进行mp3格式判断
2016/12/23 Python
python内置数据类型之列表操作
2018/11/12 Python
Django使用Jinja2模板引擎的示例代码
2019/08/09 Python
Python实现井字棋小游戏
2020/03/09 Python
Rowdy Gentleman服装和配饰:美好时光
2019/09/24 全球购物
苏格兰领先的多渠道鞋店:Begg Shoes
2019/10/22 全球购物
酒店拾金不昧表扬信
2014/01/18 职场文书
计算机专业毕业生自荐信范文
2014/03/06 职场文书
会计与审计专业自荐信范文
2014/03/15 职场文书
求职简历自荐信
2014/06/18 职场文书
地球一小时宣传标语
2014/06/24 职场文书
乡镇2014法制宣传日活动总结
2014/11/01 职场文书
2015年度保密工作总结
2015/04/24 职场文书
死亡诗社观后感
2015/06/05 职场文书
竞聘书的秘诀
2019/04/02 职场文书
JS创建或填充任意长度数组的小技巧汇总
2021/10/24 Javascript