@vism

Rак правильно сделать pessimistic lock в laravel?

К данному коду может иногда поступать много запросов подряд и код отрабатывать не успевает.
При изменении полей, ткущая запись *мягко* удаляется и создается новая.

try {
    DB::beginTransaction();

    $model = $this->model
        ->where('ident_id', '=', $model->ident_id)
        ->whereNull('deleted_at')
        ->orderBy('created_at', 'desc')
        ->withTrashed()
        ->sharedLock()
        ->first();

    $fieldType = $this->getColType($table, $fieldName);
    if ($fieldType == "decimal" && strpos($fieldValue, ",") !== false) {
        $fieldValue = str_replace(",", ".", $fieldValue);
    }

    $model = $model->fill([$fieldName => $fieldValue])->saveAsNew();
    DB::commit();
} catch (Exception $ex) {
    DB::rollback();
    dd($ex);
}

public function saveAsNew()
{
    if ($this->isDirty([
        'name',
        'ek',
        'vk',
        'category_id',
        'manufacturers_id',
        'size',
//            'vendor_code',
        'comfort_grade',
        'color',
        'option1',
    ])
    ) {
        /** @var Product $newModel */
        $newModel = $this->replicate();
        $newModel->original_id = $this->id;
        $originals = $this->getOriginal();
        if ($newModel->save()) {
            $this->setRawAttributes($originals);
            $this->delete();

            return $newModel;
        } else {
            return false;
        }
    }
    $this->save();
    return $this;
}


В данном случае происходит дублирование записей.
Мне нужно, чтоб только после окончания транзакции происходил следующий селект модели.
  • Вопрос задан
  • 292 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы