Php 如何处理表锁或查询队列

Php 如何处理表锁或查询队列,php,mysql,laravel,transactions,queue,Php,Mysql,Laravel,Transactions,Queue,我的表中有一些重复的行,但它不可能通过http请求插入,因为我对用户平衡进行了验证,每个请求都会改变用户平衡,并且一个请求必须在另一个请求之前被管理员接受。在这种情况下,用户的余额为1000美元。根据我的代码,他可以要求一次1000美元。但突然间,我的数据库中同时出现了两行。它是如何发生的,这个问题的解决方案是什么 我假设当第一个请求到达时,draw表由于其他一些计算而被锁定,因此余额保持不变,查询处于队列中,因为用户再次请求表锁定而没有得到响应,所以两个请求都被插入 请注意,这不是每天都会发生

我的表中有一些重复的行,但它不可能通过http请求插入,因为我对用户平衡进行了验证,每个请求都会改变用户平衡,并且一个请求必须在另一个请求之前被管理员接受。在这种情况下,用户的余额为1000美元。根据我的代码,他可以要求一次1000美元。但突然间,我的数据库中同时出现了两行。它是如何发生的,这个问题的解决方案是什么

我假设当第一个请求到达时,
draw
表由于其他一些计算而被锁定,因此余额保持不变,查询处于队列中,因为用户再次请求表锁定而没有得到响应,所以两个请求都被插入

请注意,这不是每天都会发生的事情。这种情况很少发生,比如一年内有1到2次重复请求


我猜任何用户双击“提交” 因此,收到了两个接收请求,每个请求都执行了代码级检查,并且没有看到执行了另一个查询

我还没见过使用桌锁或锁的情况

此解决方案将大大降低系统的性能

最简单的解决方案是让每个用户在给定时刻发送一个请求

这个问题有很多实现。 为了提供可能的解决方案,我们需要获得更多信息: 是否可以使用该会话? 可以使用队列输入查询吗?
可能每个用户在数据库中都包含一行,您只需在数据库级别创建一个唯一的键

我猜任何用户都可以双击“提交” 因此,收到了两个接收请求,每个请求都执行了代码级检查,并且没有看到执行了另一个查询

我还没见过使用桌锁或锁的情况

此解决方案将大大降低系统的性能

最简单的解决方案是让每个用户在给定时刻发送一个请求

这个问题有很多实现。 为了提供可能的解决方案,我们需要获得更多信息: 是否可以使用该会话? 可以使用队列输入查询吗?
可能每个用户在数据库中都包含一行,您只需在数据库级别创建一个唯一的键

如果用户双击submit按钮,他将被验证为
If(count($checkPendingRequest)>0){return response()->json(['status'=>false,'action'=>'已经挂起,'message'=>'已经有一个挂起的请求!'];}
所以http请求不可能,我甚至尝试了循环,但在第一次插入后返回验证错误expected@MVP,验证不够好。可能是两个请求同时进入的情况,代码行draw::create仍然未运行此表中没有唯一键,并且关系为一对多w对于user table,它是一个用laravel构建的rest api,我从来没有使用queue来输入查询。这是我的观点,在插入一行之前,第二个请求已经过验证,如何处理?如果用户双击提交按钮,他将被验证为
If(count($checkPendingRequest)>0){return response()->json(['status'=>false,'action'=>'已经挂起,'message'=>'已经有一个挂起的请求!'];}
所以http请求不可能,我甚至尝试了循环,但在第一次插入后返回验证错误expected@MVP,验证不够好。可能是两个请求同时进入的情况,代码行draw::create仍然未运行此表中没有唯一键,并且关系为一对多w对于用户表,它是一个用laravel构建的RESTAPI,我从来没有使用队列来输入查询。这是我的观点,在插入一行之前,第二个请求已经过验证,如何处理?
    public function withdrawBalance(Request $request)
    {
        if ($request->api_key == ApiKey()) {

            $userInfo = User::find($request->user_id);

            $checkPendingRequest = Withdraw::where(['user_id' => $request->user_id, 'status' => 0])->get(); //status column have default 0 until admin approval

            if (count($checkPendingRequest) > 0) {
                return response()->json(['status' => false, 'action' => 'already_pending_one', 'message' => 'Already have a pending request!.']);
            }

            $gs = GeneralSetting::first();
            $balance = HoldingBalance($request->user_id)['withdrawble_balance'];


            if ($request->amount > $balance) {
                return response()->json(['status' => false, 'action' => 'insufficiant_balance', 'message' => 'Insufficient amount!.']);
            }


            if ($request->withdraw_method == 'bkash') {
                $method_name = 'Digital';
            } else {
                $method_name = $request->withdraw_method;
            }

            Withdraw::create([
                'branch_id' => $request->branch_id ?? 1,
                'user_id' => $userInfo->id ?? null,
                'purpose' => "$method_name Withdraw",
                'withdraw_method' => $request->withdraw_method ?? null,
                'withdraw_account' => $request->withdraw_account ?? null,
                'amount' => round($request->amount, 2),
                'payble_amount' => $request->amount,
                'status' => 0
            ]);
            
            return response()->json(['status' => true, 'action' => 'success', 'message' => 'Successfully submitted withdrawn request!.']);
            
        } else {
            return "Access Denied";
        }
    }
DB::beginTransaction();
check_if_data_already_exist();
add_data();
DB::commit();