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