经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » PHP » 查看文章
thinkPHP框架乐观锁和悲观锁实例分析
来源:jb51  时间:2019/10/31 8:39:37  对本文有异议

本文实例讲述了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个人线程都会失败了。

  1. $result = $this->mysqli->query("SELECT num,version FROM goods WHERE id=1 LIMIT 1");
  2. $row = $result->fetch_assoc();
  3. $num = intval($row['num']);
  4. $version = intval($row['version']);
  5. if($num > 0){
  6. usleep(100);
  7. $this->mysqli->begin_transaction();
  8. $this->mysqli->query("UPDATE goods SET num=num-1,version=version+1 WHERE version={$version} and id=1");
  9. $affected_rows = $this->mysqli->affected_rows;
  10. if($affected_rows == 1){
  11. $this->mysqli->query("INSERT INTO log(good_id) VALUES({$num})");
  12. $affected_rows = $this->mysqli->affected_rows;
  13. if($affected_rows == 1){
  14. $this->mysqli->commit();
  15. echo "success:".$num;
  16. }else{
  17. $this->mysqli->rollback();
  18. echo "fail1:".$num;
  19. }
  20. }else{
  21. $this->mysqli->rollback();
  22. echo "fail2:".$num;
  23. }
  24. }else{
  25. echo "fail3:".$num;
  26. }
  27.  

乐观锁缺点:

  • 比如可能别人先购买的,反而后面的先买到了,这就点不太合理

乐观锁优点:

  • 这可以避免超发的现象发生

悲观锁mysql代码:

  1. #主要对所在行进行for update
  2. select * from employee where id = 1 for update;
  3. update employee set money = 0 + 1 where id = 1;
  4.  

参考链接:
https://www.kancloud.cn/mikkle/thinkphp5_study/359349

更多关于thinkPHP相关内容感兴趣的读者可查看jb51专题:《ThinkPHP入门教程》、《thinkPHP模板操作技巧总结》、《ThinkPHP常用方法总结》、《codeigniter入门教程》、《CI(CodeIgniter)框架进阶教程》、《Zend FrameWork框架入门教程》及《PHP模板技术总结》。

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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号