php - 用户注册的 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;
}
}
由于“竞争条件”问题发生在最后一刻以及将记录插入数据库时,看来我应该使用表锁定。但是我不知道锁定时使用该表的程序的其他部分会发生什么。我也不知道怎么写这段代码
解决方案
用户唯一验证需要从数据库完成,不能通过 laravel 完成。
推荐阅读
- java - 避免静态方法创建具有相同值的实例
- python - pytorch 神经网络回归模型不学习
- python - 试图使用 Python QT 文本浏览器来显示图片嵌入的 html 电子邮件
- ruby-on-rails - Rails create ActiveAdmin 接受嵌套属性取决于模型状态
- .net - 通过 Cef 事件发送 json 数据、b/w .NET 应用程序和在 Cef 浏览器中运行的 React 应用程序是否存在任何安全问题?
- javascript - Firebase - 有没有办法只获取包含特定值的数组字段的文档?
- m3u8 - 在 m3u 播放列表中结合来自两个不同来源的视频和字幕
- prolog - Prolog中计算一个列表中出现次数的方法
- python - 在 Python 代码中识别 GCP HTTP(s) Cloud Function Invoker 的身份
- header - 如何在 qweb 报告 odoo-13 中为标题提供更多空间?当我调整纸张格式时,它没有得到,谁能帮助我?