Метод 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,
который выполняет код внутри транзакции