数据编号+1 并发问题解决

        //正常写法,获取最后一条数据,新的单据编号+1,有并发问题
        $last = Article::orderByDesc('id')->first();
        $data = [
            'code'    => $last->code + 1,
        ];
        $article = Article::create($data);

        //---------------------------------------------------------------------------------//
        //解决并发问题  测试ab -t 6 -c 20 http://study.local/xxx
        DB::beginTransaction();
        $last = Article::lockForUpdate()->orderByDesc('id')->first();
        $data = [
            'code'    => $last->code + 1,
        ];
        $article = Article::create($data);
        DB::commit();
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 9

用redis自增吧,原子性的

4天前 评论

可以在redis先生成一批,记录下当前生成的最大值,之后用的时候pop一个用一个,当队列空了就根据当前最大值再生成一批,这样这要生成的时候加锁就好了,不过并发场景下用这种自增ID并不是很合理,场景允许的话考虑下雪花算法,简单一点考虑一下随机数,毫秒时间戳,uid等等进行组合

4天前 评论
农村闲散劳动力

建议还是使用内存中间件解决吧! 我写了一个包基于redis的 https://github.com/zhaocong6/lock

5天前 评论

你如果不用事务,可以再赋值之前先把 $data这个先赋值为空

5天前 评论

我写彩票时 简单处理的就是+1 今天有 就+1 没有就日期+001

5天前 评论
半人间 (楼主) 5天前

可以用 cache 递增去实现,然后 cache 有效期设置为 tomorrow

Cache::add('key', 0, \Carbon\Carbon::tomorrow());
$code = Cache::increment('key');
$article = Article::create(compact('code'));
4天前 评论

使用消息队列生成编号呗

5天前 评论
ly560020

哈哈我有一个项目也是这样 处理的 悲观锁

5天前 评论
半人间 (楼主) 4天前
ly560020 (作者) 22小时前

表示不太理解,可以在表中定义为自增字段来解决么?

6天前 评论
半人间 (楼主) 6天前
laravel_denghy (作者) 6天前
半人间 (楼主) 6天前
laravel_denghy (作者) 6天前
半人间 (楼主) 6天前
Jinrenjie 6天前

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!