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 相关文章推荐
php Http_Template_IT类库进行模板替换
Mar 19 PHP
session在PHP大型web应用中的使用
Jun 25 PHP
PHP写的获取各搜索蜘蛛爬行记录代码
Aug 21 PHP
php创建和删除目录函数介绍和递归删除目录函数分享
Nov 18 PHP
php动态生成缩略图并输出显示的方法
Apr 20 PHP
正确的PHP匹配UTF-8中文的正则表达式
May 13 PHP
PHP获取音频文件的相关信息
Jun 22 PHP
学习php设计模式 php实现原型模式(prototype)
Dec 07 PHP
Laravel中Facade的加载过程与原理详解
Sep 22 PHP
Yii 访问 Gii(脚手架)时出现 403 错误
Jun 06 PHP
解决laravel5.4下的group by报错的问题
Oct 16 PHP
Laravel配合jwt使用的方法实例
Oct 25 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实现的在线人员函数库
2008/04/09 PHP
php中将数组转成字符串并保存到数据库中的函数代码
2013/09/29 PHP
PHP使用Face++接口开发微信公众平台人脸识别系统的方法
2015/04/17 PHP
Symfony实现行为和模板中取得request参数的方法
2016/03/17 PHP
线路分流自动跳转代码;希望对大家有用!
2006/12/02 Javascript
中国地区三级联动下拉菜单效果分析
2012/11/15 Javascript
js 三级关联菜单效果实例
2013/08/13 Javascript
javascript中函数作为参数调用的方法
2015/02/09 Javascript
基于JavaScript实现TAB标签效果
2016/01/12 Javascript
详解js数组的完全随机排列算法
2016/12/16 Javascript
javascript添加前置0(补零)的几种方法
2017/01/05 Javascript
js中setTimeout的妙用--防止循环超时
2017/03/06 Javascript
详谈构造函数加括号与不加括号的区别
2017/10/26 Javascript
Angular实现的进度条功能示例
2018/02/18 Javascript
Node.js Buffer用法解读
2018/05/18 Javascript
react中Suspense的使用详解
2019/09/01 Javascript
JS实现拼图游戏
2021/01/29 Javascript
es6中new.target的作用和使用场景简单示例分析
2020/03/14 Javascript
vue实现登录、注册、退出、跳转等功能
2020/12/23 Vue.js
Angular处理未可知异常错误的方法详解
2021/01/17 Javascript
python文件写入实例分析
2015/04/08 Python
Python中xrange与yield的用法实例分析
2017/12/26 Python
详解Python的hasattr() getattr() setattr() 函数使用方法
2018/07/09 Python
Python 互换字典的键值对实例
2019/02/12 Python
python下的opencv画矩形和文字注释的实现方法
2019/07/09 Python
Python Matplotlib 基于networkx画关系网络图
2019/07/10 Python
Python 多线程其他属性以及继承Thread类详解
2019/08/28 Python
贝佳斯官方网站:Borghese
2020/05/08 全球购物
Ejb技术面试题
2015/04/29 面试题
集团公司总经理岗位职责
2013/12/20 职场文书
红领巾心向党广播稿
2014/01/19 职场文书
《孔子拜师》教学反思
2014/02/24 职场文书
文员试用期转正自我鉴定
2014/09/14 职场文书
群众路线专项整治工作情况报告
2014/10/28 职场文书
护士自荐信范文
2015/03/25 职场文书
大队委员竞选稿
2015/11/20 职场文书