如何在 Laravel 中使用锁

 2023-09-15 阅读 26 评论 0

摘要:简单# DB::beginTransaction(); // 开启事务 $good = \App\Models\Good::sharedLock()->first(); //共享锁 s锁 读锁 (名字真多...) // $good = \App\Models\Good::lockForUpdate()->first(); //排他锁 x锁 写锁... DB::commit(); 事务与锁 用锁需要先开启事务

简单#
 DB::beginTransaction(); // 开启事务
 $good = \App\Models\Good::sharedLock()->first(); //共享锁 s锁 读锁 (名字真多...)
// $good = \App\Models\Good::lockForUpdate()->first(); //排他锁 x锁 写锁...
 DB::commit();  
事务与锁
用锁需要先开启事务,事务提交,会自动解锁。

实例说明
超卖

laravel框架,
这个代码多人访问肯定会出现超卖的。

(如果这个代码用共享锁 不但不能解决问题,还会造成死锁)

测试
ab -n 6 -c 3 http://mask.ymindex.test/api/test

锁怎么开。(978 出现多次,那么到 0 的时候,也会出现多次,导致超卖)

使用排他锁解决超卖


共享和排他
共享:我可以读 写 加锁 , 别人可以 读 加锁。
排他:只有我 才 可以 读 写 加锁 , 也就是说,必须要等我提交事务,其他的才可以操作。
行锁:锁只对一行生效,比如 id=1 的那行
表锁:锁对整个表都生效

地锁,死锁:互相依赖,比如:多个锁住同一 行 / 表 数据。

如: 两个共享锁
我要修改: 你告诉我你锁了,等我("我"指的是你)先修改完。
你要修改: 我也锁了,等我(指我)先修改完。
我要修改: 你告诉我你锁了,等我(指你)先修改完。
...... 一万年后

Laravel事务解决: DB::transaction(function () {}, 5);
5是死锁时重复执行的次数 (详见文档)
.....

应用锁。
排他问题
会影响访问,你想,在锁期间,别人连商品点击来都看不了 (要等释放锁)。

所以我选择 redis 的 lpop。

if(! Redis::LPOP('stock'))
return 库存不足;

php laravel框架、————————————————
原文作者:lyxxxh
转自链接:https://learnku.com/articles/44383
版权声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请保留以上作者信息和原文链接。

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/5/59171.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息