2012-04-13 155 views
0

因此,有2個InnoDB表,員工和公司。我使用try/catch塊在事務中插入2個查詢。然而,當我在第一個查詢中犯了一個明顯的錯誤時(我把一個不正確的表名,員工而不是員工),數據庫當然不插入該查詢的行,但第二個查詢運行並被提交給數據庫而不是回滾(因爲第一個查詢未能被插入)。PDO交易提交而不是回滾

結果是emply員工表,但公司表新的記錄。我在這裏錯過了什麼?不應該從第一個查詢沒有插入回滾?

$employee_id = 2; 
$employee_name = 'Marky Mark'; 

try { 
    $dbh->beginTransaction(); 
    $query = "INSERT INTO employee (employee_name) VALUES (:employee_name)"; 
    $insert_emp = $dbh->prepare($query); 
    $insert_emp->execute(array(':employee_name' => $employee_name)); 

    $Employee_id = $dbh->lastInsertId(); 


    $query = "INSERT INTO companies (company_name,employee_id) VALUES ('SO',:Employee_id)"; 
    $insert_emp_comp = $dbh->prepare($query); 
    $insert_emp_comp->execute(array(':Employee_id' => $Employee_id)); 
    $dbh->commit(); 
} catch (Exception $e) { 
    $dbh->rollBack(); 
    echo "Failed: " . $e->getMessage(); 
} 
+0

Obvoiusly執行不會拋出異常,因爲代碼執行到公司插入語句 – 2012-04-13 18:30:04

回答

5

PDO默認不會引發異常。你必須把它配置到拋出異常:

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

退房this page對PDO如何處理錯誤的詳細信息。