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 高手之路(一)
Oct 09 PHP
function.inc.php超越php
Dec 09 PHP
收藏的PHP常用函数 推荐收藏保存
Feb 21 PHP
比较discuz和ecshop的截取字符串函数php版
Sep 03 PHP
PHP多线程批量采集下载美女图片的实现代码(续)
Jun 03 PHP
php inc文件使用的风险和注意事项
Nov 12 PHP
成为好程序员必须避免的5个坏习惯
Jul 04 PHP
php使用Jpgraph绘制3D饼状图的方法
Jun 10 PHP
ThinkPHP在Cli模式下使用模板引擎的方法
Sep 25 PHP
PHP内核探索之变量
Dec 22 PHP
YII动态模型(动态表名)支持分析
Mar 29 PHP
thinkphp5 加载静态资源路径与常量的方法
Dec 24 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垃圾代码优化操作代码
2010/08/05 PHP
CentOS6.5 编译安装lnmp环境
2014/12/21 PHP
Bootstrap+PHP实现多图上传功能实例详解
2018/04/08 PHP
php定期拉取数据对比方法实例
2019/09/22 PHP
Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点示例
2020/04/04 PHP
jquer之ajaxQueue简单实现代码
2011/09/15 Javascript
12种不宜使用的Javascript语法整理
2013/11/04 Javascript
基于jQuery实现下拉框
2014/11/24 Javascript
JavaScript数据类型详解
2015/04/01 Javascript
深入浅析javascript立即执行函数
2015/10/23 Javascript
nodejs的压缩文件模块archiver用法示例
2017/01/18 NodeJs
用纯Node.JS弹出Windows系统消息提示框实例(MessageBox)
2017/05/17 Javascript
JavaScript console的使用方法实例分析
2020/04/28 Javascript
10分钟学会js处理json的常用方法
2020/12/06 Javascript
微信小程序tab左右滑动切换功能的实现代码
2021/02/08 Javascript
[01:27:30]LGD vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
Python ftp上传文件
2016/02/13 Python
Python中文分词工具之结巴分词用法实例总结【经典案例】
2017/04/15 Python
Python利用BeautifulSoup解析Html的方法示例
2017/07/30 Python
python添加模块搜索路径和包的导入方法
2019/01/19 Python
详解python tkinter教程-事件绑定
2019/03/28 Python
python创建学生管理系统
2019/11/22 Python
python的等深分箱实例
2019/11/22 Python
Python递归及尾递归优化操作实例分析
2020/02/01 Python
Python调用Windows命令打印文件
2020/02/07 Python
jupyter notebook快速入门及使用详解
2020/11/13 Python
HTML5之WebGL 3D概述(上)—WebGL原生开发开启网页3D渲染新时代
2013/01/31 HTML / CSS
浅谈html5之sse服务器发送事件EventSource介绍
2017/08/28 HTML / CSS
德国最新街头服饰网上商店:BODYCHECK
2019/09/15 全球购物
会计学个人自荐信模板
2013/12/13 职场文书
群众路线教育实践活动方案
2014/02/02 职场文书
党员公开承诺书2015
2015/01/21 职场文书
南湾猴岛导游词
2015/02/09 职场文书
2015年个人思想总结
2015/03/09 职场文书
2016年学习雷锋精神广播稿
2015/12/17 职场文书
超级详细实用的pycharm常用快捷键
2021/05/12 Python