@Alk90
php, mysql, jquery, css, html, api

Как использовать транзакции на уровне логической части программы?

Всем привет! Допустим у меня есть несколько модулей, у которых есть методы обрабатывающие некие данные и отправляющие их в классы работы с БД на сохранение в БД. Например:
$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 не поддерживает вложенные транзакции
  • Вопрос задан
  • 274 просмотра
Пригласить эксперта
Ответы на вопрос 1
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
Так как юзер у тебя имеет метод сохранения, то соответственно все манипуляции с сохранением отдаются на откуп этому методу, а сам вызов $Users->createUser() оборачивается в трай-кэтч, и если что-то пошло не так, должно всплыть исключение, ну и роллбэк тоже лежит в зоне ответственности метода сохранения, собственно перед выбросом исключения.

ЗЫ: И $Users как переменная по пср именуется кэмэлкейсом, то есть с маленькой буквы.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы