98 lines
4.2 KiB
PHP
98 lines
4.2 KiB
PHP
<?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!");
|
||
}
|
||
} |