这篇文章主要介绍laravel排他锁lockForUpdate()的使用示例,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
对于mysql的排他锁,做了一个测试,看下是否存在排他效果。
测试1:命令行测试排他锁
首先在命令行里测试,开了两个命令行
首先在命令行1添加排他锁:
DB:: beginTransaction();,//,开启事务 goods 美元;=,商品:lockForUpdate()→第(); print_r(商品)美元;先访问路由<代码>/locktest1> 代码,正常打印出数据,个人猜想此时事务没有关闭,如果再有访问数据表的请求,应该是阻塞的。
引用>
所以在此访问<代码>/locktest2> 代码,结果还是正常打印出数据,为什么没有产生阻塞效果呢?测试3:laravel控制器方法与命令行混合测试排他锁
1,先在命令行里开启事务添加排他锁,同测试1里的命令行1的操作,
引用>
然后访问路由<代码>/locktest1> 代码,页面一直运行中,说明查询数据存在阻塞;
最后命令行里提交提交。
2,先访问路由<代码>/locktest1> 代码,正常打印出数据;
然后在命令行里开启事务添加排他锁,同测试1里的命令行1的操作,发现正常查询出数据,没有阻塞;说明laravel的控制器方法里的排他锁操作确实没有成功。总结:为什么laravel的lockForUpdate()没有效果呢,还是说laravel控制器方法执行完毕后,会自动结束事务才导致没有阻塞效果的?
引用>于是,再次做下面测试:
将路由1的控制器方法里加了一个睡眠()方法:DB:: beginTransaction();,//,开启事务 goods 美元;=,商品:lockForUpdate()→第(); print_r(商品)美元;睡眠(10);echo & # 39; ddd # 39;;然后,访问路由1 <代码>/locktest1> 代码,页面在等待刷新;再访问路由2 <代码>/locktest2> 代码,页面也在等待刷新,说明应该是产生数据阻塞了,因为路由2中没有睡眠(),正常情况下是立即执行的。
10秒过后,<代码>/locktest1> 代码页面打印出数据,同时<代码>/locktest2> 代码页面也打印出数据。由此判断,上面测试3没有产生阻塞效果,应该就是控制器的方法结束后,自动结束事务导致的。
以上是“laravel排他锁lockForUpdate()的使用示例”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!
laravel排他锁lockForUpdate()的使用示例