【问题标题】:PDO Transaction committing instead of rolling backPDO 事务提交而不是回滚
【发布时间】:2012-04-13 18:26:49
【问题描述】:

所以有 2 个 InnoDB 表,员工和公司。我使用 try/catch 块在事务中插入 2 个查询。但是,当我在第一个查询中犯了一个明确的错误时(我输入了一个不正确的表名,员工而不是员工),数据库当然不会插入该查询的行,但是第二个查询运行并被提交给数据库而不是回滚(因为第一个查询插入失败)。

结果是emply employees 表,但company 表具有新记录。我在这里想念什么?由于没有插入第一个查询,它不应该回滚吗?

$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();
}

【问题讨论】:

  • 显然执行不会抛出异常,因为代码执行到公司插入语句

标签: mysql transactions pdo innodb commit


【解决方案1】:

默认情况下,PDO 不会引发异常。您必须对其进行配置以引发异常:

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

查看this page 了解有关 PDO 如何处理错误的更多信息。

【讨论】:

    猜你喜欢
    • 2013-07-02
    • 2014-05-18
    • 1970-01-01
    • 2011-01-26
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    • 2013-11-20
    相关资源
    最近更新 更多