thinkPHP框架乐观锁和悲观锁实例分析

 更新时间:2019年10月30日 12:26:40   作者:摘星辰Li  
这篇文章主要介绍了thinkPHP框架乐观锁和悲观锁,结合实例形式分析了框架乐观锁和悲观锁的原理及thinkPHP相关实现技巧,需要的朋友可以参考下

本文实例讲述了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相关内容感兴趣的读者可查看本站专题:《ThinkPHP入门教程》、《thinkPHP模板操作技巧总结》、《ThinkPHP常用方法总结》、《codeigniter入门教程》、《CI(CodeIgniter)框架进阶教程》、《Zend FrameWork框架入门教程》及《PHP模板技术总结》。

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

相关文章

  • PHP之header函数详解

    PHP之header函数详解

    这篇文章主要介绍了PHP之header函数详解,小编觉得这个header函数的技术点还是比较重要的,感兴趣的同学可以研究下
    2021-03-03
  • Laravel自动生成UUID,从建表到使用详解

    Laravel自动生成UUID,从建表到使用详解

    今天小编就为大家分享一篇Laravel自动生成UUID,从建表到使用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-10-10
  • php 二维数组快速排序算法的实现代码

    php 二维数组快速排序算法的实现代码

    这篇文章主要介绍了php 二维数组快速排序算法的实现代码的相关资料,希望通过本文能帮助到大家,让大家实现这样的功能,需要的朋友可以参考下
    2017-10-10
  • php  intval函数的用法示例小结

    php  intval函数的用法示例小结

    这篇文章主要介绍了php  intval函数的用法,intval()函数用于将字符串转换为整数,可以指定进制数,并可以处理前导零和非数字字符,本文通过示例给大家介绍的非常详细,需要的朋友可以参考下
    2023-10-10
  • php实现微信公众号企业转账功能

    php实现微信公众号企业转账功能

    这篇文章主要为大家详细介绍了php实现微信公众号企业转账功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-10-10
  • PHP 计算两个时间段之间交集的天数示例

    PHP 计算两个时间段之间交集的天数示例

    今天小编就为大家分享一篇PHP 计算两个时间段之间交集的天数示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-10-10
  • php之二维数组排序问题

    php之二维数组排序问题

    这篇文章主要介绍了php之二维数组排序问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • yii框架使用分页的方法分析

    yii框架使用分页的方法分析

    这篇文章主要介绍了yii框架使用分页的方法,结合实例形式分析了两种Yii框架分页的实现方法及相关操作注意事项,需要的朋友可以参考下
    2019-07-07
  • PHP使用GD库制作验证码的方法(点击验证码或看不清会刷新验证码)

    PHP使用GD库制作验证码的方法(点击验证码或看不清会刷新验证码)

    这篇文章主要介绍了PHP使用GD库制作验证码的方法(点击验证码或看不清会刷新验证码)的相关资料,需要的朋友可以参考下
    2017-08-08
  • destoon供应信息title调用出公司名称的方法

    destoon供应信息title调用出公司名称的方法

    这篇文章主要介绍了destoon供应信息title调用出公司名称的方法,非常具有实用价值的一个技巧,需要的朋友可以参考下
    2014-08-08

最新评论