一个诡异的 Model::save 方法不存在的问题
前提是这样的,队列的某个consumer中的关于一个模型的save,有时候提是方法不存在
伪代码如下:
function handle()
{
$id = $this->id;
$model = Model::query()->find($id);
if (!$model) throw new Exception('not found');
Queue::push(new OtherJob($model->serial_id));
$model['attr_1'] = 'processed';
try {
$model->save();
} catch (Throwable $e) {
$this->log(vsprintf("save_fail message:[%s], serialize:[%s], type:[%s]", [
$e->getMessage(),
serialize($order),
gettype($order),
]), 'error');
}
}
偶发性的能看到日志里有如下内容:
save_fail message:[Call to a member function save() on array], o:[a
{s
”last_queue_at”;O
”Illuminate\Support\Carbon”
{s
”date”;s
”2020-04-08 16:12:58.738117”;s
”timezone_type”;i:3;s
”timezone”;s
”PRC”;}}], type:[array]
但是看数据库中的attr_1确实也变成了processed
有碰到过类似问题的吗?
我们都是这样子调用
$model->attr_1 = 'processed'; $model->save();
,还真没用过你的这种写法。你这错误信息不够全,堆栈都没了,,,
mysql 有没有读写分离? 是不是读写分离的问题?
id=217 这个数据在我的库里没有 也就是说 你 find 出来的数据是空的 所以会有这个错误
建议你把数据的信息也放到日志里,你也说了这个错误是偶发的,这样方便你去查具体是哪条数据出的错