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 相关文章推荐
mysql 搜索之简单应用
Apr 27 PHP
php ob_flush,flush在ie中缓冲无效的解决方法
May 09 PHP
php数据结构 算法(PHP描述) 简单选择排序 simple selection sort
Aug 09 PHP
关于PHP内存溢出问题的解决方法
Jun 25 PHP
PHP面向对象之旅:深入理解static变量与方法
Jan 06 PHP
PHP static局部静态变量和全局静态变量总结
Mar 02 PHP
Yii框架form表单用法实例
Dec 04 PHP
WordPress中用于获取文章信息以及分类链接的函数用法
Dec 18 PHP
PHP引用的调用方法分析
Apr 25 PHP
php使用ftp实现文件上传与下载功能
Jul 21 PHP
php JWT在web端中的使用方法教程
Sep 06 PHP
PHP判断是否是微信打开还是浏览器打开的方法
Feb 27 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/02 无线电
松下Panasonic RF-B65电路分析
2021/03/02 无线电
PHP遍历目录函数opendir()、readdir()、closedir()、rewinddir()总结
2014/11/18 PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
2018/02/23 PHP
Laravel 将数据表的数据导出,并生成seeds种子文件的方法
2019/10/09 PHP
Javascript学习笔记6 prototype的提出
2010/01/11 Javascript
通过location.replace禁止浏览器后退防止重复提交
2014/09/04 Javascript
JavaScript实现下拉列表框数据增加、删除、上下排序的方法
2015/08/11 Javascript
推荐10 个很棒的 jQuery 特效代码
2015/10/04 Javascript
jQuery常用知识点总结以及平时封装常用函数
2016/02/23 Javascript
thinkjs之页面跳转同步异步操作
2017/02/05 Javascript
关于javascript获取内联样式与嵌入式样式的实例
2017/06/01 Javascript
Iphone手机、安卓手机浏览器控制默认缩放大小的方法总结(附代码)
2017/08/18 Javascript
jQuery菜单实例(全选,反选,取消)
2017/08/28 jQuery
JavaScript requestAnimationFrame动画详解
2017/09/14 Javascript
解决Mac安装thrift因bison报错的问题
2018/05/17 Javascript
vue.js实现带日期星期的数字时钟功能示例
2018/08/28 Javascript
微信小程序批量上传图片到七牛(推荐)
2019/12/19 Javascript
extjs图形绘制之饼图实现方法分析
2020/03/06 Javascript
vue中实现点击变成全屏的多种方法
2020/09/27 Javascript
[38:41]2014 DOTA2国际邀请赛中国区预选赛 LGD VS CNB
2014/05/22 DOTA
[02:23]2014DOTA2国际邀请赛中国战队回顾
2014/08/01 DOTA
[43:24]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第二场 12.12
2020/12/17 DOTA
Python编程入门之Hello World的三种实现方式
2015/11/13 Python
python中的lambda表达式用法详解
2016/06/22 Python
python操作oracle的完整教程分享
2018/01/30 Python
Django基于ORM操作数据库的方法详解
2018/03/27 Python
python多线程之事件Event的使用详解
2018/04/27 Python
Python Matplotlib 基于networkx画关系网络图
2019/07/10 Python
解决Django no such table: django_session的问题
2020/04/07 Python
Python爬虫如何破解JS加密的Cookie
2020/11/19 Python
JDBC操作数据库的基本流程是什么
2014/10/28 面试题
消防标语大全
2014/06/07 职场文书
2014年客房服务员工作总结
2014/11/18 职场文书
幼师中班个人总结
2015/02/12 职场文书
SQL Server——索引+基于单表的数据插入与简单查询【1】
2021/04/05 SQL Server