Метод commit класса EntityManager
Метод commit класса EntityManager
завершает текущую активную транзакцию и
навсегда сохраняет все изменения, выполненные
внутри неё, в базе данных. Обычно применяется
в паре с методом beginTransaction, который
открывает транзакцию. Если транзакция не была
открыта, метод выбрасывает исключение
LogicException.
Метод не принимает параметров и не возвращает
значения. После вызова commit изменения
становятся видимыми для других подключений
и не могут быть отменены через rollback.
Синтаксис
$em->commit();
Пример
Давайте откроем транзакцию, сохраним новую
сущность и зафиксируем изменения через
commit:
<?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();
$article = new Article();
$article->setTitle('abcde');
$article->setContent('hello');
$em->persist($article);
$em->flush();
$em->commit();
return new Response((string) $article->getId());
}
}
?>
Результат выполнения кода:
1
Пример
Давайте обновим существующую сущность внутри транзакции и подтвердим изменения:
<?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/update/{id}', name: 'article_update')]
public function update(int $id, EntityManagerInterface $em): Response
{
$em->beginTransaction();
$article = $em->find(Article::class, $id);
$article->setTitle('user');
$em->flush();
$em->commit();
return new Response($article->getTitle());
}
}
?>
Результат выполнения кода:
"user"
Пример
Давайте откатим транзакцию, если при сохранении произошла ошибка, и зафиксируем её только при успешном выполнении:
<?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/save', name: 'article_save')]
public function save(EntityManagerInterface $em): Response
{
$em->beginTransaction();
try {
$article = new Article();
$article->setTitle('article');
$article->setContent('abcde');
$em->persist($article);
$em->flush();
$em->commit();
return new Response('committed');
} catch (\Throwable $e) {
$em->rollback();
return new Response('rolled back');
}
}
}
?>
Результат выполнения кода при успешном сохранении:
"committed"
Смотрите также
-
класс
EntityManager,
который управляет сущностями и транзакциями -
метод
beginTransaction,
который открывает новую транзакцию -
метод
rollback,
который отменяет текущую транзакцию -
метод
flush,
который синхронизирует изменения с базой данных