hasOne如何保证只有一条记录

class User extends Model implements AuthenticatableContract, CanResetPasswordContract
{
use Authenticatable, CanResetPassword, SoftDeletes;

public function wallet()
{
    return $this->hasOne('App\Models\Wallet');
}
}

用户有且只能有一个钱包,以下是开通钱包接口的实现:
public function create(WalletPostRequest $request)
{
...
    $user = JWTAuth::parseToken()->authenticate();
    if (!count($user->wallet)) {

        $password = Hash::make(trim($request->input('password')));
        $wallet = new Wallet(['password' => $password,
        'balance' => 0,
        'unconfirmed' => 0]);
        $user->wallet()->save($wallet);
}
...
}

暂时的实现是这样的,但是感觉还是有问题。因为同一用户如果在两个客户端上登录,并且同时调用该接口可能会创建两个wallet记录。因为代码并非线程安全,数据库也没有加锁。请问可以有什么办法通过表锁,或者行锁,或者线程锁来保证钱包只有一个吗?求最佳解决方案。
已邀请:

oz

赞同来自:

sfskhf

要回复问题请先登录注册