Метод beginTransaction
Метод beginTransaction класса EntityManager запускает новую транзакцию базы данных.
После вызова все последующие операции с базой данных выполняются в рамках этой транзакции
и не применяются окончательно до вызова метода commit. Если во время выполнения
произошла ошибка, транзакцию можно откатить методом rollback. Параметров метод не принимает.
Синтаксис
$em->beginTransaction();
Пример
Давайте начнём транзакцию, сохраним сущность и зафиксируем изменения:
<?php
namespace AppController;
use AppEntityArticle;
use DoctrineORMEntityManagerInterface;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
class ArticleController extends AbstractController
{
public function index(EntityManagerInterface $em): Response
{
$article = new Article();
$article->setTitle('article');
$em->beginTransaction();
try {
$em->persist($article);
$em->flush();
$em->commit();
} catch (\Throwable $e) {
$em->rollback();
throw $e;
}
return new Response('saved');
}
}
?>
Результат выполнения кода:
saved
Пример
Давайте откатим транзакцию при возникновении ошибки:
<?php
namespace AppController;
use AppEntityArticle;
use DoctrineORMEntityManagerInterface;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
class ArticleController extends AbstractController
{
public function index(EntityManagerInterface $em): Response
{
$em->beginTransaction();
try {
$article = new Article();
$article->setTitle('abcde');
$em->persist($article);
$em->flush();
throw new \RuntimeException('error');
$em->commit();
} catch (\Throwable $e) {
$em->rollback();
return new Response('rolled back');
}
return new Response('saved');
}
}
?>
Результат выполнения кода:
"rolled back"
Смотрите также
-
класс
EntityManager,
который управляет сущностями и транзакциями -
метод
commit,
который фиксирует текущую транзакцию -
метод
rollback,
который откатывает текущую транзакцию -
метод
wrapInTransaction,
который выполняет код внутри транзакции