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
在PHP3中实现SESSION的功能(一)
Oct 09 PHP
上传多个文件的PHP脚本
Nov 26 PHP
php模块memcache和memcached区别分析
Jun 14 PHP
php图片加中文水印实现代码分享
Oct 31 PHP
PHP表单递交控件名称含有点号(.)会被转化为下划线(_)的处理方法
Jan 06 PHP
360通用php防护代码(使用操作详解)
Jun 18 PHP
codeigniter教程之多文件上传使用示例
Feb 11 PHP
php实现文件下载功能的几个代码分享
May 10 PHP
php中的观察者模式简单实例
Jan 20 PHP
WordPress中重置文章循环的rewind_posts()函数讲解
Jan 11 PHP
PHP中->和=>的意思
Mar 31 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用户指南-cookies部分
2006/10/09 PHP
destoon实现调用当前栏目分类及子分类和三级分类的方法
2014/08/21 PHP
Laravel 5框架学习之Laravel入门和新建项目
2015/04/07 PHP
PHPCMS V9 添加二级导航的思路详解
2016/10/20 PHP
浅谈php的TS和NTS的区别
2019/03/13 PHP
laravel接管Dingo-api和默认的错误处理方式
2019/10/25 PHP
javascript面向对象之二 命名空间
2011/02/08 Javascript
jquery 插件学习(一)
2012/08/06 Javascript
一个简单的瀑布流效果(主体形式自写)
2013/05/27 Javascript
js string 转 int 注意的问题小结
2013/08/15 Javascript
ie8本地图片上传预览示例代码
2014/01/12 Javascript
javascript写的一个模拟阅读小说的程序
2014/04/04 Javascript
javascript实现的登陆遮罩效果汇总
2015/11/09 Javascript
Javascript实现通过选择周数显示开始日和结束日的实现代码
2016/05/30 Javascript
利用Mongoose让JSON数据直接插入或更新到MongoDB
2017/05/03 Javascript
基于Vue实现页面切换左右滑动效果
2020/06/29 Javascript
js屏蔽F12审查元素,禁止修改页面代码等实现代码
2020/10/02 Javascript
Nuxt.js nuxt-link与router-link的区别说明
2020/11/06 Javascript
带你使用webpack快速构建web项目的方法
2020/11/12 Javascript
[11:57]《一刀刀一天》第十七期:TI中国军团加油!
2014/05/26 DOTA
[13:18]《一刀刀一天》之DOTA全时刻21:详解TI新赛制 A队再露獠牙
2014/06/24 DOTA
Python中用format函数格式化字符串的用法
2015/04/08 Python
在Python的Bottle框架中使用微信API的示例
2015/04/23 Python
利用Django内置的认证视图实现用户密码重置功能详解
2017/11/24 Python
Python3标准库总结
2019/02/19 Python
Python终端输出彩色字符方法详解
2020/02/11 Python
python 异步async库的使用说明
2020/05/04 Python
HTML5实现多张图片上传功能
2016/03/11 HTML / CSS
canvas实现滑动验证的实现示例
2020/08/11 HTML / CSS
英国最大的体育&时尚零售公司:JD Sports
2017/12/13 全球购物
编码转换,怎样实现将GB2312编码的字符串转换为ISO-8859-1编码的字符串
2014/01/07 面试题
求职自荐书范文
2013/12/04 职场文书
起诉状范本
2015/05/20 职场文书
同意报考公务员证明
2015/06/17 职场文书
2016秋季田径运动会广播稿
2015/12/21 职场文书
MySQL令人大跌眼镜的隐式转换
2021/08/23 MySQL