php - 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。
解决方案
推荐阅读
- vba - 计算 VBA 中“全部替换”所做的替换
- java - 方法 collectFrom(List
) 对于 Main 类型未定义 - npm - Atom 使用 npm live-server 保存时不会自动重新加载
- c# - C#如何禁用任务计划程序中的某些设置字段
- javascript - 你如何改变从同一个类中渲染的 jsx 块?
- sql - PostgreSQL 不在多个通配符中
- javascript - 我如何将 react-native 移动应用程序连接到 Django
- python - Django 服务器没有运行
- java - startActivityForResult 并在活动完成时继续
- node.js - 如何在 Google App Engine 标准环境中使用 Google Cloud Build 或其他方法设置环境变量?