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者的疑难问答(2)
Oct 09 PHP
通用PHP动态生成静态HTML网页的代码
Mar 04 PHP
php下关于Cannot use a scalar value as an array的解决办法
Aug 08 PHP
ThinkPHP模板判断输出Defined标签用法详解
Jun 30 PHP
PHP实现取得HTTP请求的原文
Aug 18 PHP
CodeIgniter错误mysql_connect(): No such file or directory解决方法
Sep 06 PHP
php数组排序usort、uksort与sort函数用法
Nov 17 PHP
php格式化金额函数分享
Feb 02 PHP
php查询mysql数据库并将结果保存到数组的方法
Mar 18 PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
Sep 17 PHP
PHP面向对象类型约束用法分析
Jun 12 PHP
在 PHP 和 Laravel 中使用 Traits的方法
Nov 13 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脚本运行时的超时机制详解
2016/02/17 PHP
详解WordPress中用于更新和获取用户选项数据的PHP函数
2016/03/08 PHP
PHP设计模式之委托模式定义与用法简单示例
2018/08/13 PHP
用js实现多域名不同文件的调用方法
2007/01/12 Javascript
JavaScript的eval JSON object问题
2009/11/15 Javascript
我的javascript 函数链之演变
2011/04/07 Javascript
基于JavaScript实现继承机制之原型链(prototype chaining)的详解
2013/05/07 Javascript
JS+css 图片自动缩放自适应大小
2013/08/08 Javascript
jquery获取css中的选择器(实例讲解)
2013/12/02 Javascript
jquery设置按钮停顿3秒不可用
2014/03/07 Javascript
JavaScript中的small()方法使用详解
2015/06/08 Javascript
Node.js静态文件服务器改进版
2016/01/10 Javascript
jQuery实现验证表单密码一致性及正则表达式验证邮箱、手机号的方法
2017/12/05 jQuery
小程序兼容安卓和IOS数据处理问题及坑
2018/09/18 Javascript
详解vue-video-player使用心得(兼容m3u8)
2019/08/23 Javascript
vue点击按钮动态创建与删除组件功能
2019/12/29 Javascript
vue.js实现h5机器人聊天(测试版)
2020/07/16 Javascript
vuejs element table 表格添加行,修改,单独删除行,批量删除行操作
2020/07/18 Javascript
Vue移动端项目实现使用手机预览调试操作
2020/07/18 Javascript
PyTorch学习笔记之回归实战
2018/05/28 Python
python 发送和接收ActiveMQ消息的实例
2019/01/30 Python
在python中使用pymysql往mysql数据库中插入(insert)数据实例
2020/03/02 Python
PageFactory设计模式基于python实现
2020/04/14 Python
2020年10款优秀的Python第三方库,看看有你中意的吗?
2021/01/12 Python
css3 条纹化和透明化表格Firefox下测试成功
2014/04/15 HTML / CSS
Html5实现单张、多张图片上传功能
2019/04/28 HTML / CSS
关于h5中的fetch方法解读(小结)
2017/11/15 HTML / CSS
美国婴儿用品店:Babies”R”Us
2017/10/12 全球购物
美国宠物用品网站:Value Pet Supplies
2018/03/17 全球购物
英国著名书店:Foyles
2018/12/01 全球购物
俄罗斯童装网上商店:BebaKids
2020/06/06 全球购物
人力资源经理的岗位职责
2014/03/02 职场文书
师德演讲稿范文
2014/05/06 职场文书
反邪教宣传工作方案
2014/05/07 职场文书
八年级英语教学计划
2015/01/23 职场文书
Oracle锁表解决方法的详细记录
2022/06/05 Oracle