Задать вопрос
@Alzasr

Какой кейс или паттерн лучше использовать для защищенного кода при блокировке таблицы?

Потребовалось выполнять защищенный код с блокировкой таблицы (в частности очередь, но не только).
использую такой кейс:
public function foo(){
    $this->lockTable();
    try{
         //Что-то делаю, что может вызвать исключение
    }catch(Exception $e){
        $this->unlockTable();
        throw $e;
    }
    $this->unlockTable();
}


Приходится этот код повторять во всех местах, где нужно такое поведение. Какие есть кейсы или паттерны для данной задачи? Пока писал, на ум пришел вариант с замыканием, что-то вроде такого:

class parentClass{
     public function lockTable(){...}
     public function unlockTable(){...}
     public function safeLockAndExecute(Closure $closure){
         $this->lockTable();
         try{
             $closure();
        }catch(Exception $e){
            $this->unlockTable();
            throw $e;
        }
        $this->unlockTable();
     }
}


Может есть еще какие кейсы?
  • Вопрос задан
  • 2285 просмотров
Подписаться 1 Оценить Комментировать
Помогут разобраться в теме Все курсы
  • Skillbox
    Веб-разработчик на PHP
    9 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 2
SilenceOfWinter
@SilenceOfWinter Куратор тега PHP
та еще зажигалка...
Если речь о БД, то блокировка требуется только для метода выполняющего запрос, остальные методы-запросы вызывают его в своем коде т.е. метод поиска последних новостей вызывает метод запроса и передает в него параметры.
Вариант с замыканиями будет сложнее в реализации.
Ответ написан
@Alzasr Автор вопроса
Видимо придется использовать тот кейс, что я использую. С замыканием код будет сложнее читать, ИМХО.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽