A
A
Alexey Konovalov2021-08-03 13:01:50
PHP
Alexey Konovalov, 2021-08-03 13:01:50

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);
// на самом деле их больше

In a certain controller, I sequentially call these methods to get the saved IDs and create one more record from them, conditionally:
// В этой строке я сохраняю не связанные с нижними методами данные, 
//но на основе полученного auto increment ID мне нужно создать 
//дополнительные записи в БД (например отослать уведомление и создать задачу)
$newDataId = $saveData->saveInDb($data);

$newUserId = $Users->createUser($arrayData);
$newCompanyId = $Company->createCompany($arrayDataCompany); // допустим эта строчка вернула false

// тут можно сделать проверку что если нет каких либо из данных 
//то не выполняем метод создания, но появляется проблема, 
//если уведомления нет, то есть шанс потерять данные которые были
// сохранены в первой строке ($newDataId).
// Логично, что мы должны использовать транзакцию вокруг всего 
// этого кода и в случае ошибки выполнить $db->rollback(), а пользователю 
// вывести ошибку, что что-то пошло не так
$Notifications->create($newUserId, $newCompanyId);


And here is the question, because I am now at the controller level, then I cannot be sure that the $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

1 answer(s)
T
ThunderCat, 2021-08-03
@ThunderCat

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 question

Ask a Question

731 491 924 answers to any question