PDO::rollBack
(PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.1.0)
PDO::rollBack — Откат транзакции
Описание
Откатывает изменения в базе данных сделанные в рамках текущей транзакции, которая была создана методом PDO::beginTransaction(). Если активной транзакции нет, будет выброшено исключение PDOException.
Если в СУБД включен режим автофиксации изменений, эта функция восстановит этот режим после отката.
Некоторые СУБД, включая MySQL, автоматически неявно фиксируют изменения, когда встречаются операторы языка определения баз данных (DDL), выполняемые в рамках транзакции. Эта неявная фиксация делает невозможным откат других изменений, сделанных в рамках этой транзакции.
Возвращаемые значения
Возвращает TRUE
в случае успешного завершения или FALSE
в случае возникновения ошибки.
Примеры
Пример #1 Откат транзакции
В следующем примере создается транзакция и выполняются два запроса, которые модифицируют данные в базе, а затем база возвращается к исходному состоянию. В MySQL, тем не менее, выражение DROP TABLE автоматически фиксирует изменения, поэтому ничего откачено не будет.
<?php
/* Начинаем транзакцию, выключаем автофиксацию */
$dbh->beginTransaction();
/* Изменяем схему базы данных и данные в таблицах */
$sth = $dbh->exec("DROP TABLE fruit");
$sth = $dbh->exec("UPDATE dessert
SET name = 'hamburger'");
/* Осознаем свою ошибку и откатываем транзакцию */
$dbh->rollBack();
/* База данных возвращается в режим автофиксации */
?>
Смотрите также
- PDO::beginTransaction() - Инициализация транзакции
- PDO::commit() - Фиксирует транзакцию
- Транзакции и автофиксация изменений
- PHP Руководство
- Функции по категориям
- Индекс функций
- Справочник функций
- Расширения для работы с базами данных
- Уровни абстракции
- Объекты данных PHP
- Функция PDO::beginTransaction() - Инициализация транзакции
- Функция PDO::commit() - Фиксирует транзакцию
- Функция PDO::__construct() - Создает экземпляр PDO, предоставляющий соединение с базой данных
- Функция PDO::errorCode() - Возвращает код SQLSTATE результата последней операции с базой данных
- PDO::errorInfo
- PDO::exec
- Функция PDO::getAttribute() - Получить атрибут соеденения с базой данных
- Функция PDO::getAvailableDrivers() - Возвращает массив доступных драйверов PDO
- Функция PDO::inTransaction() - Проверяет, есть ли внутри транзакция
- Функция PDO::lastInsertId() - Возвращает ID последней вставленной строки или последовательное значение
- PDO::prepare
- PDO::query
- Функция PDO::quote() - Заключает строку в кавычки для использования в запросе
- Функция PDO::rollBack() - Откат транзакции
- Функция PDO::setAttribute() - Присвоение атрибута
Коментарии
Just a quick (and perhaps obvious) note for MySQL users;
Don't scratch your head if it isn't working if you are using a MyISAM table to test the rollbacks with.
Both rollBack() and beginTransaction() will return TRUE but the rollBack will not happen.
Convert the table to InnoDB and run the test again.
Here is a way of testing that your transaction has started when using MySQL's InnoDB tables. It will fail if you are using MySQL's MyISAM tables, which do not support transactions but will also not return an error when using them.
<?
// Begin the transaction
$dbh->beginTransaction();
// To verify that a transaction has started, try to create an (illegal for InnoDB) nested transaction.
// If it works, the first transaction did not start correctly or is unsupported (such as on MyISAM tables)
try {
$dbh->beginTransaction();
die('Cancelling, Transaction was not properly started');
} catch (PDOException $e) {
print "Transaction is running (because trying another one failed)\n";
}
?>
Should anyone reading this be slightly panicked because they just discovered that their MySQL tables are MyIsam and not InnoDb, don't worry... You can very easily change the storage engine using the following query:
ALTER TABLE your_table_name ENGINE = innodb;