Вопрос проверяет, понимаете ли вы принципы атомарности операций и умеете ли безопасно работать с БД при нескольких связанных изменениях.
Транзакции в Laravel используются для выполнения нескольких операций с БД как одного целого. Самый простой способ — метод DB::transaction(), который автоматически делает commit или rollback. Также можно управлять транзакцией вручную через beginTransaction, commit и rollBack. Транзакции помогают избежать частично сохранённых данных при ошибках.
Транзакции нужны, когда несколько запросов должны выполниться либо все вместе, либо ни один.
Определение: Transaction — это набор операций с БД, который либо полностью подтверждается (commit), либо полностью откатывается (rollback).
DB::transaction() (рекомендуемый)Этот вариант самый безопасный и удобный.
\DB::transaction(function () {
// создание пользователя
// создание связанной записи
});
Если внутри выбрасывается исключение, Laravel автоматически выполнит rollback.
Используется, если нужен полный контроль.
\DB::beginTransaction();
try {
// операции с БД
\DB::commit();
} catch (\Throwable $e) {
\DB::rollBack();
throw $e;
}
создание связанных сущностей
списание баланса и запись истории
обновление нескольких таблиц
Транзакции работают только в рамках одной БД
Долгие операции внутри транзакций могут создавать блокировки
В Eloquent транзакции работают так же, как и в Query Builder
В большинстве случаев стоит использовать DB::transaction(), а ручное управление оставлять для редких и сложных сценариев.