首页 > 解决方案 > 用户注册的 Laravel 竞赛条件

问题描述

我的应用程序的用户表不能使用唯一列。所以我已经通过 Laravel 验证完成了这项工作。这样做的问题是注册用户时有时会出现“竞争条件”问题。

我尝试了几种方法来解决问题

我使用了 firstOrCreate,现在使用了 firstOrNew,但问题没有解决。

虽然我在前面几行中检查了记录是否不重复,但我在向数据库添加记录时也检​​查了记录的重复状态,但问题并没有解决。

<?php
class RegisterController extends Controller
{
    protected function validator(array $data)
    {
        return Validator::make($data, [
            'phone' => ['required', 'digits:11', 'unique:users,phone,null,id,deleted_at,NULL', phoneRegExValidateRule()],
            // other fields ...
        ]);
    }

    protected function create(array $data)
    {
        $user = User::firstOrNew([
            'phone' => $data['phone'],
        ]);

        if ($user->exists) {
            flash()->error('error', 'duplicate user');

            return redirect()->route('home');
        } else {
            $user->fill([
                // fields ...
            ]);

            $user->save();
        }



        $user->meta()->create([
            // fields ...
        ]);

        return $user;
    }
}

由于“竞争条件”问题发生在最后一刻以及将记录插入数据库时​​,看来我应该使用表锁定。但是我不知道锁定时使用该表的程序的其他部分会发生什么。我也不知道怎么写这段代码

标签: phpsqllaravel

解决方案


用户唯一验证需要从数据库完成,不能通过 laravel 完成。


推荐阅读