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 字符截取 解决中文的截取问题,不用mb系列
Sep 29 PHP
php gd2 上传图片/文字水印/图片水印/等比例缩略图/实现代码
May 15 PHP
php中突破基于HTTP_REFERER的防盗链措施(stream_context_create)
Mar 29 PHP
如何用php获取文件名后缀
Jun 09 PHP
destoon调用discuz论坛中带图片帖子的实现方法
Aug 21 PHP
浅谈COOKIE和SESSION区别
Jul 19 PHP
PHP中COOKIES使用示例
Jul 26 PHP
PHP微信开发之微信消息自动回复下所遇到的坑
May 09 PHP
PHP屏蔽关键字实现方法
Nov 17 PHP
PHP实现留言板功能的详细代码
Mar 25 PHP
PHP FileSystem 文件系统常用api整理总结
Jul 12 PHP
PHP保存Base64图片base64_decode的问题整理
Nov 04 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
windows下的WAMP环境搭建图文教程(推荐)
2017/07/27 PHP
javascript 模拟JQuery的Ready方法实现并出现的问题
2009/12/06 Javascript
javascript仿php的print_r函数输出json数据
2013/09/13 Javascript
jQuery中获取checkbox选中项等操作及注意事项
2013/11/24 Javascript
javascript:json数据的页面绑定示例代码
2014/01/26 Javascript
js光标定位文本框回车表单提交问题的解决方法
2015/05/11 Javascript
jQuery EasyUI编辑DataGrid用combobox实现多级联动
2016/08/29 Javascript
js 颜色选择插件
2017/01/23 Javascript
JavaScript实现AOP详解(面向切面编程,装饰者模式)
2017/12/19 Javascript
JS中获取 DOM 元素的绝对位置实例详解
2018/04/23 Javascript
详解redis在nodejs中的应用
2018/05/02 NodeJs
vant实现购物车功能
2020/06/29 Javascript
js实现点击选项置顶动画效果
2020/08/25 Javascript
vue el-upload上传文件的示例代码
2020/12/21 Vue.js
Python文本处理之按行处理大文件的方法
2018/04/09 Python
对python中两种列表元素去重函数性能的比较方法
2018/06/29 Python
numpy向空的二维数组中添加元素的方法
2018/11/01 Python
详解Python3注释知识点
2019/02/19 Python
Python数据类型之Number数字操作实例详解
2019/05/08 Python
使用python实现ftp的文件读写方法
2019/07/02 Python
Python实现报警信息实时发送至邮箱功能(实例代码)
2019/11/11 Python
解析HTML5的存储功能和web SQL的相关操作方法
2016/02/19 HTML / CSS
荷兰皇家航空公司中国官网:KLM中国
2017/12/13 全球购物
GoDaddy英国:全球排名第一的域名注册商
2018/06/08 全球购物
有原因的手表:Flex Watches
2019/03/23 全球购物
外包公司软件测试工程师
2014/11/01 面试题
高中军训第一天感言
2014/03/06 职场文书
办公室文员工作自我鉴定
2014/09/19 职场文书
护士2014年终工作总结
2014/11/11 职场文书
公务员年度考核评语
2014/12/31 职场文书
创先争优个人总结
2015/03/04 职场文书
机关单位2016年法制宣传日活动总结
2016/04/01 职场文书
创业计划书之婴幼儿游泳馆
2019/09/11 职场文书
导游词之镇江焦山
2019/11/21 职场文书
Vue3.0 手写放大镜效果
2021/07/25 Vue.js
Python 数据可视化神器Pyecharts绘制图像练习
2022/02/28 Python