方案详解:使用laravel解决库存超出问题
时间:2021-06-11
来源:互联网
今天PHP爱好者给大家带来下面由laravel教程栏目给大家介绍使用laravel解决库存超出的几个方案,希望对需要的朋友有所帮助!
数据库字段
1.错误的示范
/**
* 错误示范
* Create by Peter Yang
* 2021-06-08 10:57:59
* @return string
*/
function test1()
{
//商品id
$id = request()->input('id');
$product = Product::where('id', $id)->firstOrFail();
if ($product->num <= 0) {
return "卖光啦!!";
}
//仓库减1
$product->decrement('num');
return "success";
}
使用go模拟并发
package mainimport (
"fmt"
"github.com/PeterYangs/tools/http"
"sync")func main() {
client := http.Client()
wait := sync.WaitGroup{}
for i := 0; i < 50; i++ {
wait.Add(1)
go func(w *sync.WaitGroup) {
defer wait.Done()
res, _ := client.Request().GetToString("http://www.api/test1?id=1")
fmt.Println(res)
}(&wait)
}
wait.Wait()}
在数据库中查看库存
库存已超出
2.redis原子锁
/**
* redis原子锁
* Create by Peter Yang
* 2021-06-08 11:00:31
*/
function test2()
{
//商品id
$id = request()->input('id');
$lock = \Cache::lock("product_" . $id, 10);
try {
//最多等待5秒,5秒后未获取到锁,则抛出异常
$lock->block(5);
$product = Product::where('id', $id)->firstOrFail();
if ($product->num <= 0) {
return "卖光啦!!";
}
//仓库减1
$product->decrement('num');
return 'success';
}catch (LockTimeoutException $e) {
return '当前人数过多';
} finally {
optional($lock)->release();
}
}
库存正常
3.mysql悲观锁
/**
* mysql悲观锁
* Create by Peter Yang
* 2021-06-08 11:00:47
*/
function test3()
{
//商品id
$id = request()->input('id');
try {
\DB::beginTransaction();
$product = Product::where('id', $id)->lockForUpdate()->first();
if ($product->num <= 0) {
return "卖光啦!!";
}
//仓库减1
$product->decrement('num');
\DB::commit();
return "success";
} catch (\Exception $exception) {
}
}
库存正常
4.mysql乐观锁
/**
* mysql乐观锁
* Create by Peter Yang
* 2021-06-08 11:00:47
*/
function test4()
{
//商品id
$id = request()->input('id');
$product = Product::where('id', $id)->first();
if ($product->num <= 0) {
return "卖光啦!!";
}
//修改前检查库存和之前是否一致,不一致说明已经有变动,则放弃更改
$res = \DB::update('UPDATE `product` SET num = num -1 WHERE id = ? AND num=?', [$id, $product->num]);
if (!$res) {
return '当前人数过多';
}
return 'success';
}
库存正常
优化乐观锁
修改库存的sql修改为
\DB::update('UPDATE `product` SET num = num -1 WHERE id = ? AND num-1 >= 0', [$id]);
以上就是方案详解:使用laravel解决库存超出问题的详细内容,更多请关注php爱好者其它相关文章!
-
《我的相册里一半是自拍,一半是风景(假装在旅游)》 时间:2025-05-14
-
币安如何参与链上投票?-治理代币投票流程解析 时间:2025-05-14
-
币安稳定币有哪些?-支持的稳定币种与用途分析 时间:2025-05-14
-
《“我今天不生气”——然后就被一句话破防了》 时间:2025-05-14
-
币安怎么创建子账户?-子账号开通与权限设置指南 时间:2025-05-14
-
币安怎么购买OP币?-Optimism代币交易完整流程 时间:2025-05-14
今日更新
-
css怎么将文本框设置为只读
阅读:18
-
怎么使用web/phpstorm将本地代码实时自动同步到远程服务器
阅读:18
-
html如何设置单元格颜色
阅读:18
-
css3怎么将滚动条隐藏
阅读:18
-
如何使用java去除html标签
阅读:18
-
html如何改网页名称
阅读:18
-
html4与html5的区别有哪些
阅读:18
-
html input怎么设置虚线边框样式
阅读:18
-
css如何清除input默认样式
阅读:18
-
Goland如何正确开启一个项目
阅读:18