这样使用悲观锁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不知道会不会等待,没用锁的话,系统卡的时候还是会导致重复提交

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 5

你用sleep 测试下就知道了

1年前 评论
giao哥

测下呗

1年前 评论

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

1年前 评论

测了一下是有用的

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

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