Как правильно сделать транзакцию 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(); будет безошибочно откатывать именно свою транзакцию?
  • Вопрос задан
  • 343 просмотра
Решения вопроса 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
Да, почти все нормально.
Разумеется все транзакции изолированы друг от друга, в этом их смысл.
prepare к транзакциям никакого отношения не имеет, и никак на них не влияет.

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

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

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

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

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