Answer the question
In order to leave comments, you need to log in
How to use transactions at the level of the logical part of the program?
Hello! Let's say I have several modules that have methods that process some data and send it to the database classes to save it in the database. For example:
$newUserId = $Users->createUser($arrayData);
$newCompanyId = $Company->createCompany($arrayDataCompany);
// на самом деле их больше
// В этой строке я сохраняю не связанные с нижними методами данные,
//но на основе полученного auto increment ID мне нужно создать
//дополнительные записи в БД (например отослать уведомление и создать задачу)
$newDataId = $saveData->saveInDb($data);
$newUserId = $Users->createUser($arrayData);
$newCompanyId = $Company->createCompany($arrayDataCompany); // допустим эта строчка вернула false
// тут можно сделать проверку что если нет каких либо из данных
//то не выполняем метод создания, но появляется проблема,
//если уведомления нет, то есть шанс потерять данные которые были
// сохранены в первой строке ($newDataId).
// Логично, что мы должны использовать транзакцию вокруг всего
// этого кода и в случае ошибки выполнить $db->rollback(), а пользователю
// вывести ошибку, что что-то пошло не так
$Notifications->create($newUserId, $newCompanyId);
$Users->createUser()
transaction is no longer used inside. How to be in such a situation? Mysql doesn't support nested transactions.
Answer the question
In order to leave comments, you need to log in
Since the user has a save method, then, accordingly, all save manipulations are at the mercy of this method, and the $Users->createUser () call itself turns into a tri-catch, and if something went wrong, an exception should pop up, well, rollback also lies in the area of responsibility of the save method, in fact, before throwing an exception.
PS: And $Users as a variable is called a camelcase, that is, with a small letter.
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question