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

Метод beginTransaction

Метод beginTransaction класса Connection запускает новую транзакцию базы данных. После вызова этого метода все последующие SQL-запросы выполняются в рамках одной транзакции до тех пор, пока не будет вызван метод commit или rollBack. Метод не принимает параметров и возвращает значение bool: true в случае успешного запуска транзакции.

Транзакции позволяют выполнить группу операций как единое целое: если хотя бы одна операция завершится ошибкой, все изменения можно откатить.

Синтаксис

public function beginTransaction(): bool

Пример

Давайте запустим транзакцию и выполним вставку данных с последующим подтверждением:

<?php namespace App\Controller; use Doctrine\DBAL\Connection; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Attribute\Route; class ArticleController extends AbstractController { #[Route('/article/insert', name: 'article_insert')] public function insert(Connection $connection): Response { $connection->beginTransaction(); $connection->executeStatement( 'INSERT INTO article (title, content) VALUES (?, ?)', ['abcde', 'article text'] ); $connection->commit(); return new Response('transaction committed'); } } ?>

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

"transaction committed"

Пример

Давайте запустим транзакцию и откатим изменения при возникновении ошибки:

<?php namespace App\Controller; use Doctrine\DBAL\Connection; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Attribute\Route; class ArticleController extends AbstractController { #[Route('/article/rollback', name: 'article_rollback')] public function rollback(Connection $connection): Response { $connection->beginTransaction(); try { $connection->executeStatement( 'INSERT INTO article (title, content) VALUES (?, ?)', ['user', 'text'] ); $connection->executeStatement( 'INSERT INTO article (title, content) VALUES (?, ?)', ['abcde', null] ); $connection->commit(); } catch (\Throwable $e) { $connection->rollBack(); return new Response('transaction rolled back'); } return new Response('transaction committed'); } } ?>

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

"transaction rolled back"

Пример

Давайте проверим, активна ли транзакция после её запуска:

<?php namespace App\Controller; use Doctrine\DBAL\Connection; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Attribute\Route; class ArticleController extends AbstractController { #[Route('/article/check', name: 'article_check')] public function check(Connection $connection): Response { $res = $connection->isTransactionActive(); $connection->beginTransaction(); $res = $connection->isTransactionActive(); $connection->rollBack(); return new Response($res ? 'active' : 'not active'); } } ?>

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

"active"

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

  • метод commit,
    который подтверждает транзакцию
  • метод rollBack,
    который откатывает транзакцию
  • метод isTransactionActive,
    который проверяет активность транзакции
  • класс Connection,
    который представляет соединение с базой данных
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить