РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
20 of 258 menu

Метод rollback

Метод rollback класса EntityManager откатывает текущую активную транзакцию базы данных. Он вызывается после beginTransaction и отменяет все изменения, которые были выполнены внутри транзакции, но ещё не были зафиксированы через commit. Параметров метод не принимает. Если активной транзакции нет, метод выбрасывает исключение LogicException.

Синтаксис

$em->rollback();

Пример

Давайте начнём транзакцию, сохраним сущность, а затем откатим изменения через rollback:

<?php namespace App\Controller; use App\Entity\Article; use Doctrine\ORM\EntityManagerInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Attribute\Route; class ArticleController extends AbstractController { #[Route('/article', name: 'article_create')] public function create(EntityManagerInterface $em): Response { $em->beginTransaction(); try { $article = new Article(); $article->setTitle('abcde'); $article->setText('article'); $em->persist($article); $em->flush(); $em->rollback(); return new Response('rolled back'); } catch (\Throwable $e) { $em->rollback(); throw $e; } } } ?>

Результат выполнения кода:

rolled back

Сущность Article не будет сохранена в базе данных, так как изменения были отменены методом rollback.

Пример

Давайте обработаем ошибку внутри транзакции и откатим её в блоке catch:

<?php namespace App\Controller; use App\Entity\Article; use Doctrine\ORM\EntityManagerInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Attribute\Route; class ArticleController extends AbstractController { #[Route('/article/safe', name: 'article_safe')] public function safe(EntityManagerInterface $em): Response { $em->beginTransaction(); try { $article = new Article(); $article->setTitle('abcde'); $article->setText('article'); $em->persist($article); $em->flush(); $em->commit(); return new Response('committed'); } catch (\Throwable $e) { $em->rollback(); return new Response('rolled back'); } } } ?>

Если ошибки нет, результат выполнения кода:

committed

Если внутри транзакции возникла ошибка, результат выполнения кода:

rolled back

Смотрите также

  • класс EntityManager,
    который управляет сущностями и транзакциями
  • метод beginTransaction,
    который начинает новую транзакцию
  • метод commit,
    который фиксирует текущую транзакцию
  • метод wrapInTransaction,
    который выполняет код внутри транзакции
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить