首页 > 解决方案 > Laravel Observers 偶尔会在保存操作后无法触发

问题描述

Laravel 版本:5.5.*

PHP版本:7.1.9

数据库驱动和版本:MYSQL 5.7.19

说明

大约一个月前,我们最近将我们的应用程序从 Laravel 5.4 更新到了 5.5,大约 5 天前,我们的观察者开始遇到一些违规行为。我们的应用程序是一个会计软件,这是基本交易的典型流程。

在提交和成功之前输入并验证交易详细信息创建交易日志条目和相应的行项目如果上述2成功,则保存交易并且观察者触发保存的操作以增加相应总账的余额帐户。问题在某些独特的场景中,上述两个步骤都成功运行,但观察者要么无法触发,要么根本无法触发,它无法更新余额。

问题

有没有办法检测观察者内部的失败动作?或者至少触发失败的响应?

另外,如果有更好的方法可以达到相同的结果,请提出建议。

例子:

考虑一个 User 模型,它使用创建时的客户计数来更新 Customer 表。

class User extends Model {
    protected static function boot()
    {
        User::created(function (Model $model) {
            //increment number of specified customer type
            $customer = $this->customerType;
            $customer += 1;
            $customer->save();
        });
    }

    //returns an instance of the customer type for specified user
    public function customerType()
    {
        return $this->belongTo(CustomerType::class);
    }
}

当同时发送许多请求时会出现问题。

当前计数:3

如果 2 个新用户尝试同时更新该字段并且第 3 个用户参与进来,这些就是结果

新用户 1:发现计数为 3,并将其更新为 4

新用户 2:发现计数为 3,并将其更新为 4

新用户 3:发现计数为 4,并将其更新为 5

在上述情况下,计数最终将是 5 而不是 6。

标签: phplaravel

解决方案


推荐阅读