【问题标题】:MySQL transaction: queries committed anywayMySQL事务:无论如何提交的查询
【发布时间】:2017-07-26 17:34:49
【问题描述】:

几天前我发现了 PDO 和事务,它们很棒。今天我写了我的第一笔交易,但它并没有像预期的那样结束。为了测试它,我在两个查询之一中放置了一个错误的不存在的表,并且与哪个查询无关,另一个(正确的)一个无论如何都会被提交。

我在一些网站上阅读了语法结构,它似乎是正确的,但也许错误就在那里。这些表是 InnoDB。或者更好的是,phpMyAdmin 在数据库概览表中报告MyISAM 在最后一个摘要行,但每个表行的列“type”报告InnoDB;我认为这可能是因为 MyISAM 是服务器上的默认类型,对吗?

代码如下:

$conn = new PDO($db->getDsn(), $db->getUsername(), $db->getPassword());

try {
    $conn->beginTransaction();
    $stmt = $conn->prepare('INSERT INTO trips (country_code, year, img, showX) VALUES (:country_code, :year, :img, :showX)');
    $stmt->execute(array(':country_code' => strtolower($country_code), ':year' => $year, ':img' => $rename_response, ':showX' => $show_hide));
    $tripID = $conn->lastInsertId();

    $stmt = $conn->prepare('INSERT INTO trips_multilang (tripID, lang, country_name) VALUES (:tripID, :lang, :country_name)');
    $stmt->execute(array(':tripID' => $tripID, ':lang' => $trip_lang, ':country_name' => strtolower($country_name)));

    $conn->commit();
} catch (PDOException $e) {
    $conn->rollBack();
    die($e->getMessage());
}

【问题讨论】:

  • MyISAM 不是事务性的。你的表需要是 InnoDB

标签: php mysql pdo transactions


【解决方案1】:

向您的 $db 类添加另一个方法 $db->getOptions(),它返回一个数组

return [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION];

然后调用PDO为

$conn = new PDO($db->getDsn(), $db->getUsername(), $db->getPassword(), $db->getoptions());

之后,您的代码将开始迎头赶上。
现在,您正在捕获任何异常,因为实际上没有抛出任何异常。

附带说明,您必须捕获 Exception,而不是 PDOException 和 you must re-throw an exception in case of error,而不是消失。

【讨论】:

  • 完美而干净的答案,感谢您的常识!我尝试了 PDOException 和 Exception 并且两者都工作,只是为了好奇,我为什么要抓住第二个而不是第一个?
猜你喜欢
  • 2014-07-19
  • 2012-07-02
  • 2012-05-22
  • 1970-01-01
  • 2015-07-10
  • 2019-01-09
  • 2012-09-28
  • 2016-10-05
  • 2023-03-27
相关资源
最近更新 更多