PHP Conference Japan 2024

PDO::rollBack

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

PDO::rollBack 回滾交易

說明

public PDO::rollBack(): bool

回滾目前的交易,由 PDO::beginTransaction() 啟始。

如果資料庫設定為自動提交模式,則此函式在回滾交易後將恢復自動提交模式。

某些資料庫,包括 MySQL,在交易中發出資料庫定義語言 (DDL) 陳述式(例如 DROP TABLE 或 CREATE TABLE)時,會自動發出隱含的 COMMIT。隱含的 COMMIT 將阻止您回滾交易邊界內的任何其他變更。

參數

此函式沒有參數。

回傳值

成功時返回 true,失敗時返回 false

錯誤/例外

如果沒有活動交易,則會拋出 PDOException 例外。

注意即使 PDO::ATTR_ERRMODE 屬性不是 PDO::ERRMODE_EXCEPTION,也會引發例外。

範例

範例 #1 rollback 一個交易

以下範例開始一個交易,並在 rollback 變更之前發出兩個修改資料庫的陳述式。 然而,在 MySQL 上,DROP TABLE 陳述式會自動提交交易,因此交易中的任何變更都不會 rollback。

<?php
/* 開始一個交易,關閉自動提交 */
$dbh->beginTransaction();

/* 變更資料庫結構和資料 */
$sth = $dbh->exec("DROP TABLE fruit");
$sth = $dbh->exec("UPDATE dessert
SET name = 'hamburger'"
);

/* 發現錯誤並 rollback 變更 */
$dbh->rollBack();

/* 資料庫連線現在回到自動提交模式 */
?>

另請參閱

新增註解

使用者貢獻的註解 3 則註解

JonasJ
16 年前
給 MySQL 使用者的一則快速(或許很明顯)的注意事項;

如果您使用 MyISAM 資料表來測試 rollback,如果它沒有作用,請不要感到疑惑。

rollBack() 和 beginTransaction() 都會返回 TRUE,但 rollback 不會發生。

將資料表轉換為 InnoDB 並再次執行測試。
brian at diamondsea dot com
16 年前
以下是如何測試在使用 MySQL 的 InnoDB 資料表時,您的交易是否已開始的方法。如果您使用 MySQL 的 MyISAM 資料表(它不支援交易,但在使用它們時也不會返回錯誤),它將會失敗。

<?
// 開始交易
$dbh->beginTransaction();

// 為了驗證交易已開始,請嘗試建立一個(對於 InnoDB 而言是非法的)巢狀交易。
// 如果它有效,則第一個交易未正確開始或不受支援(例如在 MyISAM 資料表上)
try {
$dbh->beginTransaction();
$dbh->beginTransaction(); // 嘗試開始巢狀交易
die('取消,交易未正確開始');
} catch (PDOException $e) {
}
?>
Petros Giakouvakis
14 年前
如果有人讀到這篇文章,因為剛發現他們的 MySQL 資料表是 MyISAM 而不是 InnoDB 而感到有點恐慌,別擔心... 你可以很容易地使用以下查詢來更改儲存引擎

ALTER TABLE your_table_name ENGINE = InnoDB;
To Top