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()}";
}

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