2012-03-05 60 views
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)在事務內發出。

這是什麼原因導致問題以及如何解決它?

+0

你有沒有連續不斷地執行這些語句的原因?我從來沒有見過像這樣的單個調用運行多個語句。 – 2012-03-05 12:13:06

+0

我想在單個事務中創建所有表。如果在SQL代碼中有錯誤,我不希望它們都不會被創建。 – Placido 2012-03-05 12:21:17

+0

它可以在一次調用中執行多個PDO語句。如果在SQL代碼中沒有錯誤,則所有四個表都已成功創建。 – Placido 2012-03-05 12:26:38

回答

1

與幾位建議者一樣,事務性語義不適用於mySQL中的數據定義語言語句(DDL)。

PDO實現者顯然沒有嘗試在DBMS中不支持的情況下添加某種客戶端事務語義。

相關問題