3
我試圖在一個PDO事務中創建四個表。多個CREATE TABLE在一個事務中出錯 - 沒有PDO異常
當語句的第一個「CREATE TABLE ...」部分包含錯誤時,我成功地得到異常,錯誤消息和回滾。但是,當第一個「CREATE TABLE ...」部分正確寫入(如下例所示)時,我不會收到異常,提交併且只創建第一個表。
下面的代碼:
$conn = Connection::getInstance();
$conn->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$conn->dbh->beginTransaction();
$stmt = $conn->dbh->prepare("
CREATE TABLE IF NOT EXISTS `1st table` (valid SQL-code)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;
CREATE TABLE IF NOT EXISTS `2nd table` (SQL-code with an error)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;
CREATE TABLE IF NOT EXISTS `3rd table`...
CREATE TABLE IF NOT EXISTS `4th table`...
");
try
{
$stmt->execute();
$conn->dbh->commit();
}
catch (Exception $e)
{
$conn->dbh->rollBack();
echo $e->getMessage();
}
unset($stmt);
一些研究,我發現下面的note在php.net後:
有些數據庫,包括MySQL,自動發出一個隱式COMMIT時數據庫定義語言(DDL )語句(如DROP TABLE或CREATE TABLE)在事務內發出。
這是什麼原因導致問題以及如何解決它?
你有沒有連續不斷地執行這些語句的原因?我從來沒有見過像這樣的單個調用運行多個語句。 – 2012-03-05 12:13:06
我想在單個事務中創建所有表。如果在SQL代碼中有錯誤,我不希望它們都不會被創建。 – Placido 2012-03-05 12:21:17
它可以在一次調用中執行多個PDO語句。如果在SQL代碼中沒有錯誤,則所有四個表都已成功創建。 – Placido 2012-03-05 12:26:38