Задать вопрос

Как правильно сделать транзакцию PDO в этом случае?

На странице https://secure.php.net/manual/ru/pdo.transactions.php есть пример.
Правильно ли я переложил этот пример на случай с 2 отдельными запросами с prepare:
try {
    $db->beginTransaction(); // начало

    $db = $this->Connect->prepare('UPDATE `balance` FROM `user` SET `balance`=`balance`-100 WHERE `id`=:id');
    $db->bindParam(':id', $id);
    $db->execute();

    $db = $this->Connect->prepare('UPDATE `balance` FROM `user` SET `balance`=`balance`+100 WHERE `id`=:id');
    $db->bindParam(':id', $id);
    $db->execute();

    $db->commit(); // конец
} catch (Exception $e) {
    $db->rollBack(); // откат
    echo "Ошибка: " . $e->getMessage();
}

Всё ли в этом коде нормально. Транзакции при beginTransaction() маркируются внутренним номером каким ни будь? Eсли таких запросов идёт много параллельно в системе каждый rollBack(); будет безошибочно откатывать именно свою транзакцию?
  • Вопрос задан
  • 344 просмотра
Подписаться 2 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Skillbox
    Веб-разработчик на PHP
    9 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
Да, почти все нормально.
Разумеется все транзакции изолированы друг от друга, в этом их смысл.
prepare к транзакциям никакого отношения не имеет, и никак на них не влияет.

Единственное замечание, которое можно сделать,
echo "Ошибка: " . $e->getMessage();
выглядит очень по-деревенски.

Чтобы нормальным образом обработать исключение, его надо перевыбросить, то есть написать
throw $e;

Ну и убедиться, что все условия для успешного выполнения транзакций выполнены
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽