給 MySQL 使用者的一則快速(或許很明顯)的注意事項;
如果您使用 MyISAM 資料表來測試 rollback,如果它沒有作用,請不要感到疑惑。
rollBack() 和 beginTransaction() 都會返回 TRUE,但 rollback 不會發生。
將資料表轉換為 InnoDB 並再次執行測試。
(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.1.0)
PDO::rollBack — 回滾交易
回滾目前的交易,由 PDO::beginTransaction() 啟始。
如果資料庫設定為自動提交模式,則此函式在回滾交易後將恢復自動提交模式。
某些資料庫,包括 MySQL,在交易中發出資料庫定義語言 (DDL) 陳述式(例如 DROP TABLE 或 CREATE TABLE)時,會自動發出隱含的 COMMIT。隱含的 COMMIT 將阻止您回滾交易邊界內的任何其他變更。
此函式沒有參數。
範例 #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();
/* 資料庫連線現在回到自動提交模式 */
?>
給 MySQL 使用者的一則快速(或許很明顯)的注意事項;
如果您使用 MyISAM 資料表來測試 rollback,如果它沒有作用,請不要感到疑惑。
rollBack() 和 beginTransaction() 都會返回 TRUE,但 rollback 不會發生。
將資料表轉換為 InnoDB 並再次執行測試。
以下是如何測試在使用 MySQL 的 InnoDB 資料表時,您的交易是否已開始的方法。如果您使用 MySQL 的 MyISAM 資料表(它不支援交易,但在使用它們時也不會返回錯誤),它將會失敗。
<?
// 開始交易
$dbh->beginTransaction();
// 為了驗證交易已開始,請嘗試建立一個(對於 InnoDB 而言是非法的)巢狀交易。
// 如果它有效,則第一個交易未正確開始或不受支援(例如在 MyISAM 資料表上)
try {
$dbh->beginTransaction();
$dbh->beginTransaction(); // 嘗試開始巢狀交易
die('取消,交易未正確開始');
} catch (PDOException $e) {
}
?>
如果有人讀到這篇文章,因為剛發現他們的 MySQL 資料表是 MyISAM 而不是 InnoDB 而感到有點恐慌,別擔心... 你可以很容易地使用以下查詢來更改儲存引擎
ALTER TABLE your_table_name ENGINE = InnoDB;