分析laravel排他锁lockForUpdate()使用问题

发布时间 - 2021-01-08 00:00:00    点击率:

下面由Laravel教程栏目给大家介绍laravel排他锁lockForUpdate()使用问题,希望对需要的朋友有所帮助!

对于mysql的排他锁,做了一个测试,看下是否存在排他效果。

测试1:命令行测试排他锁首先在命令行里测试,开了两个命令行首先在命令行1添加排他锁:然后再命令行2里测试访问:可以看到,确实产生阻塞了,在命令行1里commit结束后,命令行2里也执行结果了。所以,在命令行里测试排他锁是没有问题的。

测试2:laravel控制器方法里测试排他锁

下面测试下laravel里的排他锁:
两个路由:
Route::get('/locktest1','LockController@LockTest1');
Route::get('/locktest2','LockController@LockTest2');
控制器中的 LockTest1LockTest2这两个方法内容都一样:

DB::beginTransaction(); // 开启事务
$goods = Goods::lockForUpdate()->first();
print_r($goods);

先访问路由/locktest1,正常打印出数据,个人猜想此时事务没有关闭,如果再有访问数据表的请求,应该是阻塞的。
所以在此访问/locktest2,结果还是正常打印出数据,为什么没有产生阻塞效果呢?

测试3:laravel控制器方法与命令行混合测试排他锁

1、先在命令行里开启事务添加排他锁,同测试1里的命令行1的操作;
然后访问路由/locktest1,页面一直运行中,说明查询数据存在阻塞;
最后命令行里commit提交。
2、先访问路由/locktest1,正常打印出数据;
然后在命令行里开启事务添加排他锁,同测试1里的命令行1的操作,发现正常查询出数据,没有阻塞;说明laravel的控制器方法里的排他锁操作确实没有成功。

总结:为什么laravel的lockForUpdate()没有效果呢,还是说laravel控制器方法执行完毕后,会自动结束事务才导致没有阻塞效果的?

于是,再次做下面测试:
将路由1的控制器方法里加了一个sleep()方法:

DB::beginTransaction(); // 开启事务
$goods = Goods::lockForUpdate()->first();
print_r($goods);sleep(10);echo 'ddd';

然后,访问路由1/locktest1,页面在等待刷新;再访问路由2/locktest2,页面也在等待刷新,说明应该是产生数据阻塞了,因为路由2中没有sleep(),正常情况下是立即执行的。
10秒过后,/locktest1页面打印出数据,同时/locktest2页面也打印出数据。

由此判断,上面测试3没有产生阻塞效果,应该就是控制器的方法结束后,自动结束事务导致的。

以上是个人分析,如有大神路过,还望留言告知一个正确答案!

更多编程相关知识,请访问:编程教学!!


# laravel  # mysql  # 命令行  # 里加  # 应该是  # 结束后  # 在此  # 如有  # 也在  # 开了  # 这两个  # 大神 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】  html5如何实现懒加载图片_ intersectionobserver api用法【教程】  Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)  微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  如何用AI帮你把自己的生活经历写成一个有趣的故事?  高端建站三要素:定制模板、企业官网与响应式设计优化  香港服务器租用费用高吗?如何避免常见误区?  Laravel安装步骤详细教程_Laravel环境搭建指南  Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲  Laravel怎么连接多个数据库_Laravel多数据库连接配置  深圳网站制作平台,深圳市做网站好的公司有哪些?  Laravel如何实现多对多模型关联?(Eloquent教程)  使用spring连接及操作mongodb3.0实例  Laravel怎么清理缓存_Laravel optimize clear命令详解  微信小程序 HTTPS报错整理常见问题及解决方案  Laravel如何实现全文搜索功能?(Scout和Algolia示例)  php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】  七夕网站制作视频,七夕大促活动怎么报名?  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比  iOS验证手机号的正则表达式  Laravel如何实现用户密码重置功能?(完整流程代码)  Laravel DB事务怎么使用_Laravel数据库事务回滚操作  Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出  如何用AWS免费套餐快速搭建高效网站?  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  如何在腾讯云服务器上快速搭建个人网站?  Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧  如何在阿里云购买域名并搭建网站?  laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  再谈Python中的字符串与字符编码(推荐)  百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧  laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析  Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道  Android滚轮选择时间控件使用详解  php打包exe后无法访问网络共享_共享权限设置方法【教程】  Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中  Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程  Laravel如何记录自定义日志?(Log频道配置)  Laravel Fortify是什么,和Jetstream有什么关系  laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法  Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  如何在橙子建站中快速调整背景颜色?  Laravel定时任务怎么设置_Laravel Crontab调度器配置  jQuery 常见小例汇总  PHP 500报错的快速解决方法  晋江文学城电脑版官网 晋江文学城网页版直接进入  Laravel如何生成URL和重定向?(路由助手函数)