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程序设计有所帮助。

您可能感兴趣的文章:


  • 本文相关:
  • tp框架(thinkphp)实现三次登陆密码错误之后锁定账号功能示例
  • thinkphp5查询数据及处理结果的方法小结
  • nginx下thinkphp5的配置方法详解
  • thinkphp5实现的查询数据库并返回json数据实例
  • thinkphp5实现数据库添加内容的方法
  • tp5(thinkphp5)框架实现多数据库查询的方法
  • tp5(thinkphp5)框架数据库db增删改查常见操作总结
  • thinkphp5框架闭包函数与子查询传参用法示例
  • tp5(thinkphp5)框架连接数据库的方法示例
  • thinkphp的i方法使用详解
  • php房贷计算器实例代码,等额本息,等额本金
  • php实现腾讯与百度坐标转换
  • laravel5.5中利用passport实现auth认证的方法
  • 如何解决phpmyadmin导入数据库文件最大限制2048kb
  • php中子类重载父类的方法【parent::方法名】
  • php中使用memcache存储session的三种配置方法
  • thinkphp curd方法之limit方法详解
  • thinkphp5.1框架中request类四种调用方式示例
  • yii模块实现绑定二级域名的方法
  • 免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved