> Что такое транзакции в базах данных и для чего они нужны (PHP)

Уровень: junior · Роль: backend · Язык: PHP · Категория: Технические вопросы

Компании: vanta

Стек: PHP

> Пример ответа

Короткий ответ

Транзакция - это последовательность операций с базой данных, которая выполняется как единое целое: либо все операции применяются успешно, либо ни одна. Транзакции нужны для обеспечения целостности данных при выполнении нескольких связанных изменений. Они гарантируют свойства ACID: атомарность, согласованность, изоляцию и долговечность. Без транзакций при сбое или ошибке база данных могла бы остаться в частично изменённом, некорректном состоянии.

Подробное объяснение

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

Ключевые свойства ACID:

  • Атомарность - транзакция выполняется полностью или не выполняется вовсе. Если на середине происходит ошибка, все изменения откатываются.
  • Согласованность - транзакция переводит базу данных из одного корректного состояния в другое. Например, перевод денег не может уменьшить баланс одного счёта без увеличения другого.
  • Изоляция - параллельные транзакции не влияют друг на друга. Промежуточные состояния одной транзакции не видны другим до её завершения.
  • Долговечность - после успешного commit изменения сохраняются даже при сбое системы.

Транзакции критически важны в сценариях, где несколько операций должны быть связаны: перевод денег между счетами, создание заказа с обновлением остатков, регистрация пользователя с созданием профиля.

В PHP транзакции обычно управляются через PDO или ORM (например, Doctrine, Eloquent). Важно помнить, что транзакции работают только с InnoDB в MySQL, для MyISAM они не поддерживаются.

На практике

В типичном PHP-приложении транзакция выглядит так: начинаем транзакцию, выполняем несколько запросов, если всё прошло успешно - делаем commit, при любой ошибке - rollback. Это защищает от ситуаций, когда, например, заказ создан, но оплата не списана, или товар списан со склада, но заказ не сохранён.

Также транзакции важны при конкурентном доступе: два пользователя одновременно оформляют заказ на последний товар. Без транзакций возможен overselling - продажа большего количества товара, чем есть на складе.

Пример кода

PHP
<?php
$pdo = new PDO('mysql:host=localhost;dbname=shop', 'user', 'pass');
$pdo->beginTransaction();
try {
// Списание средств со счёта отправителя
$stmt = $pdo->prepare('UPDATE accounts SET balance = balance - ? WHERE id = ?');
$stmt->execute([100, $senderId]);
// Зачисление средств получателю
$stmt = $pdo->prepare('UPDATE accounts SET balance = balance + ? WHERE id = ?');
$stmt->execute([100, $receiverId]);
// Если всё прошло успешно - фиксируем изменения
$pdo->commit();
} catch (Exception $e) {
// При любой ошибке откатываем все изменения
$pdo->rollBack();
throw $e;
}

Как отвечать на собеседовании

Начни с определения транзакции и её главной цели - обеспечение целостности данных. Затем перечисли свойства ACID и кратко объясни каждое. Приведи практический пример из реальной жизни: перевод денег или создание заказа. Упомяни, что в PHP транзакции реализуются через PDO или ORM. Если спросят про уровни изоляции - покажи понимание, но для junior достаточно упомянуть, что они существуют и решают проблему конкурентного доступа.

Что проверяет интервьюер

Интервьюер оценивает:

  • понимание базового назначения транзакций, а не заученное определение;
  • знание свойств ACID и умение объяснить их на примере;
  • понимание, зачем нужен rollback и commit;
  • осознание проблем, которые возникают без транзакций (частичные изменения, гонки);
  • практический опыт работы с транзакциями в PHP.

Типичные ошибки

  • Путаница между commit и rollback - когда что вызывать.
  • Утверждение, что транзакции работают во всех таблицах MySQL - забывают про MyISAM.
  • Игнорирование обработки исключений - если не обернуть в try/catch, rollback не выполнится.
  • Непонимание разницы между транзакцией и обычным набором запросов.
  • Попытка объяснить транзакции без упоминания ACID или с неверной трактовкой свойств.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью