这样使用悲观锁for update有用吗

DB::beginTransaction();
            try {

                $workorderModel = new Workorder();
                $exists = $workorderModel->where('order_id', $order->id)->where('status', 'action')->forUpdate()->exists();
                if ($exists > 0) {
                    throw new InvalidRequestException('该订单存在未处理工单(收到工单),请先撤销');
                }


                $receiver_user_id = $order->seller_user_id;

                Workorder::create([
                    'order_id'         => $order->id,
                    'task_sn'          => $order->task_sn,
                    'order_status'     => $order->status,
                    'sender_user_id'   => Auth::user()->id,
                    'sender_user_type' => Auth::user()->type,
                    'receiver_user_id' => $receiver_user_id,
                    'enum'         => $request->enum,
                    'description'  => $request->description,
                    'picture'      => $request->picture,
                ]);

                DB::commit();

            }catch (\Exception $e) {
                DB::rollBack();
                throw $e;
            }

之前都是用于->first()里面
这个用于exits不知道会不会等待,没用锁的话,系统卡的时候还是会导致重复提交

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 5

你用sleep 测试下就知道了

2年前 评论
giao哥

测下呗

2年前 评论

这样肯定没用呀,forUpdate是行级锁,并不会再并发线下避免你重复写入的情况,你可以用个字段唯一索引约束,或者用redis锁就可以解决你并发下重复写入的问题

2年前 评论

测了一下是有用的

2年前 评论
QIN秦同学 2年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!