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 相关文章推荐
文件上传程序的全部源码
Oct 09 PHP
mysql 字段类型说明
Apr 27 PHP
解析PHP获取当前网址及域名的实现代码
Jun 23 PHP
php jquery 多文件上传简单实例
Dec 23 PHP
php绘图中显示不出图片的原因及解决
Mar 05 PHP
php调用新浪短链接API的方法
Nov 08 PHP
php使用类继承解决代码重复的问题
Feb 11 PHP
thinkphp微信开之安全模式消息加密解密不成功的解决办法
Dec 02 PHP
PHP检测链接是否存在的代码实例分享
May 06 PHP
教你在header中隐藏php的版本信息
Aug 10 PHP
PHP实现根据数组的值进行分组的方法
Apr 20 PHP
Laravel 验证码认证学习记录小结
Dec 20 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
长波有什么东西
2021/03/01 无线电
打造超酷的PHP数据饼图效果实现代码
2011/11/23 PHP
jquery+php实现导出datatables插件数据到excel的方法
2015/07/06 PHP
关于IFRAME 自适应高度的研究
2006/07/20 Javascript
共享自己写一个框架DreamScript
2007/01/20 Javascript
JavaScript中通过闭包解决只能取得包含函数中任何变量最后一个值的问题
2010/08/12 Javascript
JavaScript 更严格的相等 [译]
2012/09/20 Javascript
Three.js学习之正交投影照相机
2016/08/01 Javascript
用js写的一个路由(简单实例)
2016/09/24 Javascript
JS实现最简单的冒泡排序算法
2017/02/15 Javascript
JS实现数组去重复值的方法示例
2017/02/18 Javascript
zTree异步加载展开第一级节点的实现方法
2017/09/05 Javascript
Vue代码分割懒加载的实现方法
2017/11/23 Javascript
Node.js连接Sql Server 2008及数据层封装详解
2018/08/27 Javascript
JavaScript基于数组实现的栈与队列操作示例
2018/12/22 Javascript
React Ant Design树形表格的复杂增删改操作
2020/11/02 Javascript
Vue SPA 首屏优化方案
2021/02/26 Vue.js
[05:15]DOTA2英雄梦之声_第16期_灰烬之灵
2014/06/21 DOTA
探究Python中isalnum()方法的使用
2015/05/18 Python
Python 自动刷博客浏览量实例代码
2017/06/14 Python
Python IDLE入门简介
2017/12/08 Python
python方向键控制上下左右代码
2018/01/20 Python
python 识别图片中的文字信息方法
2018/05/10 Python
python批量复制图片到另一个文件夹
2018/09/17 Python
python实现顺序表的简单代码
2018/09/28 Python
Python Scrapy框架第一个入门程序示例
2020/02/05 Python
python简单实现最大似然估计&scipy库的使用详解
2020/04/15 Python
python 实现关联规则算法Apriori的示例
2020/09/30 Python
美国在线宠物用品商店:Entirely Pets
2017/01/01 全球购物
优秀大学生职业生涯规划书
2014/02/27 职场文书
新闻工作者先进事迹
2014/05/26 职场文书
货物运输服务质量承诺书
2014/05/29 职场文书
2014年采购部工作总结
2014/11/20 职场文书
2014教师专业技术工作总结
2014/12/03 职场文书
党员个人党性分析材料
2014/12/18 职场文书
教你怎么用Python selenium操作浏览器对象的基础API
2021/06/23 Python