Всем привет! Допустим у меня есть несколько модулей, у которых есть методы обрабатывающие некие данные и отправляющие их в классы работы с БД на сохранение в БД. Например:
$newUserId = $Users->createUser($arrayData);
$newCompanyId = $Company->createCompany($arrayDataCompany);
// на самом деле их больше
В неком контроллере я последовательно вызываю эти методы чтобы получить cохраненные ID и создать из них, условно еще одну запись:
// В этой строке я сохраняю не связанные с нижними методами данные,
//но на основе полученного 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()
уже не используется транзакция. Как быть в такой ситуации? ведь Mysql не поддерживает вложенные транзакции