【问题标题】:Laravel can not update value in time. Simultaneously requestsLaravel 无法及时更新值。同时请求
【发布时间】:2023-01-28 10:13:49
【问题描述】:

我有 PHP 8.3 和 Laravel 9 项目。

我有一个用于更新余额列值的发布路由。并在下面的控制器中运行

 public function loadFunds(FundToCardRequest $request)
{
    $user = auth()->user();
    $request['clientUsername'] = 'username';
    $request['username'] = $user->username;
    $sum = $request['amount'];
    $request['amount'] *= (1 - config('commissions.credit_card_from_wallet') / 100);
    $response = SomeService::post('updateBalace', $request->toArray())->collect();

    if ($response->get('code') == 200) {
        DB::transaction(function () use ($user, $request, $sum) {
            $balance = $user->wallets()->where('currency', 'USD')->first()->pivot->balance;
            $user->wallets()->updateExistingPivot(1, ['balance' => $balance - $sum]);

            $user->transactions()->create([

该函数接收具有以下规则的自定义请求。

public function rules()
{
    $balance_usd = auth()->user()->wallets()->where('currency', 'USD')->first()->pivot->balance;

    return [
        'amount' => ['numeric', 'required', new NotZeroAmount(), new SendMoneyBalance($balance_usd)],
        'cardId' => ['required'],
        'ArrayHashId' => ['required'],
    ];
}

有一个规则汇款余额检查当前余额是否足以发送数量的钱。

问题如下。有时客户端可以同时发送两个请求。第一个请求需要时间处理,之后余额应该减少,余额中的最终金额应该是不够的。但是第二个请求通过了规则,因为第一个余额无法更新。在这两个请求余额变为负值之后。

有什么技术可以防止这种同时请求吗?或者像其他语言中的 await 结构。

【问题讨论】:

    标签: php laravel laravel-8 laravel-9 php-8


    【解决方案1】:

    这称为竞争条件,您基本上想要做的是为每个用户或您的偏好的每个请求创建某种或唯一的锁。

    例子

    Cache::lock('foo', 10)->block(5, function () {
        // Lock acquired after waiting a maximum of 5 seconds...
    });
    

    参考here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-01
      • 2018-10-01
      • 2018-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-25
      相关资源
      最近更新 更多