Я работаю над PHP/MySQL-приложением, используя структуру Yii.
Я столкнулся со следующей ситуацией:
В моем VideoController
у меня есть actionCreate
, который создает новое видео и actionPrivacy
, которое устанавливает конфиденциальность в Видео. Проблема в том, что во время actionCreate
вызывается метод setPrivacy
модели Video
, который в настоящее время имеет транзакцию. Я хотел бы, чтобы создание видео также было в транзакции, что приводит к ошибке, так как транзакция уже активна.
В комментарии этот ответ, пишет Билл Карвин
Таким образом, нет необходимости делать классы классов домена или классы DAO транзакции - просто сделайте это на уровне контроллера
и этот ответ:
Поскольку вы используете PHP, объем ваших транзакций не более один запрос. Таким образом, вы должны просто использовать транзакции, управляемые контейнерами, не транса. То есть, начните транзакцию с самого начала обработки запроса и фиксации (или откат) по завершении обрабатывая запрос.
Если я управляю транзакциями в контроллере, у меня будет куча кода, который выглядит так:
public function actionCreate() {
$trans = Yii::app()->getDb()->beginTransaction();
...action code...
$trans->commit();
}
Это приводит к дублированию кода во многих местах, где мне нужны транзакции для действия.
Или я мог бы реорганизовать его в методы beforeAction()
и afterAction()
родительского класса Controller
, который затем автоматически создавал транзакции для каждого выполняемого действия.
Были ли проблемы с этим методом? Что такое хорошая практика для управления транзакциями для приложения PHP?