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 5.0 Pear安装方法
Dec 06 PHP
php 常用类整理
Dec 23 PHP
php多用户读写文件冲突的解决办法
Nov 06 PHP
Codeigniter的一些优秀特性总结
Jan 21 PHP
Laravel 5框架学习之环境与配置
Apr 08 PHP
PHP技术开发微信公众平台
Jul 22 PHP
php计算title标题相似比的方法
Jul 29 PHP
PHP操作MySQL的mysql_fetch_* 函数的常见用法教程
Dec 25 PHP
PHP全局变量与超级全局变量区别分析
Apr 01 PHP
php使用正则表达式获取字符串中的URL
Dec 29 PHP
Laravel框架实现抢红包功能示例
Oct 31 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
Nov 23 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
ThinkPHP上使用多说评论插件的方法
2014/10/31 PHP
PHP中iconv函数转码时截断字符问题的解决方法
2015/01/21 PHP
php文件扩展名判断及获取文件扩展名的N种方法
2015/09/12 PHP
PHP+ajax实现二级联动菜单功能示例
2018/08/10 PHP
firefox中JS读取XML文件
2006/12/21 Javascript
javascript 贪吃蛇实现代码
2008/11/22 Javascript
离开页面时检测表单元素是否被修改,提示保存的js代码
2010/08/25 Javascript
JavaScript判断文件上传类型的方法
2014/09/02 Javascript
JQuery 实现在同一页面锚点链接之间的平滑滚动
2014/10/29 Javascript
jQuery设置指定网页元素宽度和高度的方法
2015/03/25 Javascript
JS实现获取当前URL和来源URL的方法
2016/08/24 Javascript
微信小程序 Nginx环境配置详细介绍
2017/02/14 Javascript
微信小程序 合法域名校验出错详解及解决办法
2017/03/09 Javascript
jQuery 实时保存页面动态添加的数据的示例
2017/08/14 jQuery
Vue项目History模式404问题解决方法
2018/10/31 Javascript
vue实现路由懒加载及组件懒加载的方式
2019/06/11 Javascript
vue实现在线翻译功能
2019/09/27 Javascript
Vue使用Element实现增删改查+打包的步骤
2020/11/25 Vue.js
[32:56]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第二场 12.11
2020/12/16 DOTA
python模拟新浪微博登陆功能(新浪微博爬虫)
2013/12/24 Python
Python下使用Psyco模块优化运行速度
2015/04/05 Python
解决Python中由于logging模块误用导致的内存泄露
2015/04/23 Python
python单元测试unittest实例详解
2015/05/11 Python
python使用分治法实现求解最大值的方法
2015/05/12 Python
更改Ubuntu默认python版本的两种方法python-> Anaconda
2016/12/18 Python
Django实现的自定义访问日志模块示例
2017/06/23 Python
Python分治法定义与应用实例详解
2017/07/28 Python
Python编程实现二分法和牛顿迭代法求平方根代码
2017/12/04 Python
Django中从mysql数据库中获取数据传到echarts方式
2020/04/07 Python
预备党员党课思想汇报
2014/01/13 职场文书
北京英文导游词
2015/02/12 职场文书
区域销售经理岗位职责
2015/04/02 职场文书
家装业务员岗位职责
2015/04/03 职场文书
2016年寒假家长评语
2015/10/10 职场文书
Mysql外键约束的创建与删除的使用
2022/03/03 MySQL
详解SQL的窗口函数
2022/04/21 Oracle