Урок - Транзакции средствами PDO

Главная » Курсы » Курс PHP5, PDO - PHP Data Objects » Урок - Транзакции средствами PDO

Обучающий онлайн курс
PHP5, PDO - PHP Data Objects

Лицензия: Копирование запрещено.

Транзакции средствами PDO

Понятие транзакции

Транзакция (англ. transaction) — в информатике, группа последовательных операций, которая представляет собой логическую единицу работы с данными. Транзакция может быть выполнена либо целиком и успешно, соблюдая целостность данных и независимо от параллельно идущих других транзакций, либо не выполнена вообще и тогда она не должна произвести никакого эффекта. Транзакции обрабатываются системой, в процессе работы которых создаётся история транзакций.

Различают последовательные (обычные), параллельные и распределённые транзакции. Также, в некоторых системах реализованы автономные транзакции, или под-транзакции, которые являются автономной частью родительской транзакции.

Пример транзакции: Необходимо перевести с банковского счёта номер A на счёт номер B сумму в X денежных единиц. Этого можно достичь,приведённой последовательностью действий:

  • Начать транзакцию
    • прочесть баланс на счету номер A
    • уменьшить баланс на X денежных единиц на счету номер A
    • сохранить новый баланс счёта номер A,
    • прочесть баланс на счету номер B
    • увеличить баланс на X денежных единиц на счету номер B
    • сохранить новый баланс счёта номер B
  • Окончить транзакцию

Эти действия представляют собой логическую единицу работы «перевод суммы между счетами», и таким образом, являются транзакцией. Если прервать данную транзакцию, к примеру, в середине, и не аннулировать все изменения, легко оставить владельца счёта номер A без X единиц, тогда как владелец счета номер B их не получит.

Особенности транзакций в PDO

К сожалению, не каждая база данных поддерживает транзакции, поэтому PDO должен работать в режиме так называемый "автоматической фиксации"("auto-commit") при первом открытии соединения.

Режим автоматической фиксации означает, что каждый запрос, который мы запускаем имеет свою собственную неявную транзакцию, если база данных поддерживает его, или без транзакции, если база данных не поддерживает их.

Если необходима транзакция, следует импользовать PDO::BeginTransaction() для инициирования процесса. Если основной драйвер не поддерживает транзакции, будет выброшено исключение PDOException (независимо от настройки обработки ошибок).

Когда мы находимся в транзакции, мы можете использовать PDO::Commit() или PDO::Rollback(), чтобы завершить транзакцию.

Когда скрипт завершен или когда связь вот-вот будет закрыта, если у вас есть незаконченные транзакции, PDO автоматически даст им откат назад (Rollback). Это мера безопасности, чтобы избежать нецелостности в тех случаях, когда сценарий неожиданно завершается - если вы явно не совершаете транзакции, то предполагается, что возникла ошибка, поэтому откат выполняется для сохранности данных. Для выполнения транзакций используется:

  • PDO::beginTransaction() - начало транзакции
  • PDO::commit() - завершить транзацию, применить все запросы.
  • PDO::rollback() - отмена транзакции

PDO::beginTransaction() - начало транзакции

bool PDO::beginTransaction(void) 

PDO::beginTransaction() - возвращает TRUE если успешно или FALSE, когда неудача.

Если основной драйвер не поддерживает транзакции, будет выброшено исключение PDOException (независимо от настройки обработки ошибок).

PDO::commit() - сохранить транзакцию

bool PDO::commit(void) 

Возвращает TRUE, если успешно или FALSE, когда неудача.

PDO::rollback() - откат транзакции

bool PDO::rollBack(void) 

Возвращает TRUE, если успешно или FALSE, когда неудача.

Откат текущей транзакции выдаст ошибку вызова, если нет активной транзакции.

Примеры использования транзакции:

$pdo->beginTransaction();
// запрос с ошибкой
$sql = "INSERT INTO `articles` (`title`, `weight`) VALUES ('Saved', 2000)";
if ($pdo->exec( $sql) === FALSE) {
$pdo->rollback();
echo "Fail\n";
}else{
$pdo->commit();
echo "Complete\n";
}

$pdo->beginTransaction();
// запрос без ошибки
$sql = "INSERT INTO `articles` (`title`, `weight`) VALUES ('Saved', 2000)";
if ($pdo->exec($sql) === FALSE) {
$pdo->rollback();
echo "Fail\n";
}else{
$pdo->commit();
echo "Complete\n";
}

Особенности транзакций драйверов PDO

В MySQL для работы транзакций необходимо использовать базы данных innoDb или DBD.