2012-04-13 258 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如何处理错误的详细信息。