Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Транзакции PHP PDO: Работа с базой данных

Предположим, у нас есть две таблицы в базе данных: products и orders. При оформлении заказа необходимо сделать два запроса — добавить новую запись в таблицу orders и уменьшить количество доступных товаров в таблице products. Если происходит ошибка при изменении одной из таблиц, то данные в базе могут оказаться несогласованными. Чтобы избежать таких ситуаций, используются транзакции.

Транзакции - это механизм обеспечения целостности данных в базе данных, который позволяет выполнить несколько операций как единое целое. Если одна из операций в транзакции завершается неудачно, то все предыдущие операции в транзакции откатываются, возвращая базу данных в исходное состояние

При создании соединения PDO по умолчанию работает в режиме автоматической фиксации. Это значит, что каждый запрос к базе данных, который вы выполняете, неявно заключается в транзакцию. Чтобы явно указать начало транзакции, нужно использовать метод beginTransaction(). Если все запросы в рамках транзакции выполнены успешно, вы можете зафиксировать её методом commit(). Если же во время выполнения одного из запросов произошла ошибка, транзакция откатывается методом rollBack() и база данных остается без изменений

$conn = new PDO('sqlite::memory:');

try {
  // Начало транзакции
  $conn->beginTransaction();

  // Выполняем запросы в рамках транзакции
  $conn->exec("INSERT INTO users (id, username, phone) VALUES (12, 'Joe', '1234')");
  $conn->exec("INSERT INTO salary (id, user_id, amount) VALUES (8, 12, 50000)");
  // Фиксируем результат, если все запросы в рамках транзакции выполнились успешно
  $conn->commit();

} catch (Exception $e) {
  // Откатываем изменения, если что-то пошло не так
  $conn->rollBack();
  echo "Ошибка:  {$e->getMessage()}";
}

В рамках транзакции можно выполнять любое количество запросов


Самостоятельная работа

  • Выполните шаги из урока у себя на компьютере
  • Проверьте работу транзакций на практике. Напишите несколько запросов в рамках транзакции. Сымитируйте ошибку во время выполнения одного из запросов. Для этого можно перед фиксацией транзакции методом commit() выбросить ошибку:

    throw new Exception("Ошибка во время транзакции");
    
  • Сделайте выборку из базы данных и убедитесь, что база данных осталась без изменений


Дополнительные материалы

  1. Транзакции

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Об обучении на Хекслете

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
от 25 000 ₸ в месяц
Разработка веб-приложений на Laravel
10 месяцев
с нуля
Старт 7 ноября

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»
Изображение Тото

Задавайте вопросы, если хотите обсудить теорию или упражнения. Команда поддержки Хекслета и опытные участники сообщества помогут найти ответы и решить задачу