This commit is contained in:
2025-07-29 17:50:57 +03:00
parent e4c8d7e6c8
commit 8436569ce5
9 changed files with 1223 additions and 839 deletions

View File

@@ -0,0 +1,98 @@
<?php
/**
* @noinspection SqlNoDataSourceInspection
*/
namespace goodboyalex\php_db_components_pack\traits\Database;
use PDO;
use PDOException;
/**
* Трейт для работы с транзакциями базы данных.
*
* @author Александр Бабаев
* @package php_components_pack
* @version 1.0
* @since 1.0
* @see PDO
*/
trait DatabaseTransactions
{
/**
* Начинает транзакцию.
*
* @return void
* @throws PDOException Если транзакция уже начата или не удалось начать.
*/
public function InitTransaction (): void
{
// Проверка, не находится ли текущая транзакция в процессе.
if ($this->InTransaction())
// - если находится, то выбрасываем исключение.
throw new PDOException("Транзакция уже начата! / Transaction already started!");
// Начинаем транзакцию
$isSuccess = $this->DataBaseHandle->beginTransaction();
// Если транзакция не началась
if (!$isSuccess)
// - то выбрасываем исключение.
throw new PDOException("Ошибка при начале транзакции! / Transaction start error!");
}
/**
* Проверяет, находится ли текущая транзакция в процессе.
*
* @return bool Результат проверки: <code>true</code> - в процессе, <code>false</code> - нет.
*/
public function InTransaction (): bool
{
return $this->DataBaseHandle->inTransaction();
}
/**
* Отправляет транзакцию в базу данных.
*
* @return void
* @throws PDOException Если транзакция не начата или не отправлена.
*/
public function Commit (): void
{
// Проверка, не находится ли текущая транзакция в процессе
if (!$this->InTransaction())
// - если нет, то выбрасываем исключение.
throw new PDOException("Транзакция не начата! / Transaction not started!");
// Отправляем транзакцию в базу данных
$isSuccess = $this->DataBaseHandle->commit();
// Если транзакция не отправлена
if (!$isSuccess)
// - то выбрасываем исключение.
throw new PDOException("Ошибка при отправке транзакции в базу данных! / Transaction send error!");
}
/**
* Откатывает транзакцию.
*
* @return void
* @throws PDOException Если транзакция не начата или не откатана.
*/
public function RollBack (): void
{
// Проверка, не находится ли текущая транзакция в процессе
if (!$this->InTransaction())
// - если нет, то выбрасываем исключение.
throw new PDOException("Транзакция не начата! / Transaction not started!");
// Откатываем транзакцию
$isSuccess = $this->DataBaseHandle->rollBack();
// Если транзакция не откатана
if (!$isSuccess)
// - то выбрасываем исключение.
throw new PDOException("Ошибка при откате транзакции! / Transaction rollback error!");
}
}