PDO::rollBack

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.1.0)

PDO::rollBack β€” ΠžΡ‚ΠΊΠ°Ρ‚ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ

ОписаниС

public function PDO::rollBack(): bool

ΠžΡ‚ΠΊΠ°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ измСнСния Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… сдСланныС Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ, которая Π±Ρ‹Π»Π° создана ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ PDO::beginTransaction().

Если Π² Π‘Π£Π‘Π” Π²ΠΊΠ»ΡŽΡ‡Ρ‘Π½ Ρ€Π΅ΠΆΠΈΠΌ автофиксации ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, эта функция восстановит этот Ρ€Π΅ΠΆΠΈΠΌ послС ΠΎΡ‚ΠΊΠ°Ρ‚Π°.

НСкоторыС Π‘Π£Π‘Π”, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ MySQL, автоматичСски нСявно Ρ„ΠΈΠΊΡΠΈΡ€ΡƒΡŽΡ‚ измСнСния, ΠΊΠΎΠ³Π΄Π° Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ выраТСния языка опрСдСлСния Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… (DDL), выполняСмыС Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ. Π­Ρ‚Π° нСявная фиксация Π΄Π΅Π»Π°Π΅Ρ‚ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ ΠΎΡ‚ΠΊΠ°Ρ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, сдСланных Π² Ρ€Π°ΠΌΠΊΠ°Ρ… этой Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ.

Бписок ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²

Π‘ΠΈΠ³Π½Π°Ρ‚ΡƒΡ€Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ содСрТит ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ значСния

Ѐункция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ true, Ссли Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ»Π°ΡΡŒ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, ΠΈΠ»ΠΈ false, Ссли Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ошибка.

Ошибки

Если Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π½Π΅Ρ‚, Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π±Ρ€ΠΎΡˆΠ΅Π½ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ PDOException.

Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ выбрасываСтся, Π΄Π°ΠΆΠ΅ Ссли для Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° PDO::ATTR_ERRMODE Π½Π΅ установили Ρ€Π΅ΠΆΠΈΠΌ PDO::ERRMODE_EXCEPTION.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #1 ΠžΡ‚ΠΊΠ°Ρ‚ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ создаётся транзакция ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π΄Π²Π° запроса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΡŽΡ‚ Π΄Π°Π½Π½Ρ‹Π΅ Π² Π±Π°Π·Π΅, Π° Π·Π°Ρ‚Π΅ΠΌ Π±Π°Π·Π° возвращаСтся ΠΊ исходному ΡΠΎΡΡ‚ΠΎΡΠ½ΠΈΡŽ. Π’ MySQL, Ρ‚Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ DROP TABLE автоматичСски фиксируСт измСнСния, поэтому ΠΈΡ… ΠΎΡ‚ΠΊΠ°Ρ‚ Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Ρ‘Ρ‚.

<?php
/* НачинаСм Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ, ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ автоматичСской фиксации */
$dbh->beginTransaction();

/* ИзмСняСм схСму Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π΄Π°Π½Π½Ρ‹Π΅ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ… */
$sth = $dbh->exec("DROP TABLE fruit");
$sth = $dbh->exec("UPDATE dessert
SET name = 'hamburger'"
);

/* ОсознаСм свою ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΈ ΠΎΡ‚ΠΊΠ°Ρ‚Ρ‹Π²Π°Π΅ΠΌ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ */
$dbh->rollBack();

/* Π‘Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… возвращаСтся Π² Ρ€Π΅ΠΆΠΈΠΌ автофиксации */
?>

Π‘ΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅

οΌ‹Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ 3 notes

up
52
JonasJ ΒΆ
18 years ago
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.
up
13
brian at diamondsea dot com ΒΆ
18 years ago
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";
}
?>
up
6
Petros Giakouvakis ΒΆ
15 years ago
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;