PDO 事务函数与 MySQL 事务语句?

Posted

技术标签:

【中文标题】PDO 事务函数与 MySQL 事务语句?【英文标题】:PDO transaction functions vs MySQL transaction statements? 【发布时间】:2015-02-12 01:37:07 【问题描述】:

PDO 提供启动、提交和回滚事务的功能:

$dbh->beginTransaction();
$sth = $dbh->prepare('
    ...
');
$sth->execute(); // in real code some values will be bound
$dbh->commit();

是否有任何理由使用 PDO 函数而不是简单地使用 mysql 中的事务语句?即:

$sth = $dbh->prepare('
    START TRANSACTION;
    ...
    COMMIT;
');
$sth->execute(); // in real code some values will be bound

更新: 只是给其他正在研究此问题的人的注释,经过一些测试后,我实际上发现了上面的第二种情况(在 prepare() 中使用 START TRANSACTIONCOMMIT)将导致抛出异常。因此,为了使用带有预准备语句的事务,您必须使用第一种情况中显示的 PDO 函数。

【问题讨论】:

【参考方案1】:

从可移植性的角度来看,您最好使用 PDO 提供的界面,以防您想要使用不同的 DBMS,或者让其他团队成员使用其他 DBMS。

例如SQLite uses a slightly different syntax;如果要从 MySQL 迁移到 SQLite 数据库,则必须更改 php 代码中包含语句 START TRANSACTION; 的每个字符串,因为它不再是数据库的有效语法。 SQL Server 2014 是另一个不使用此语法的示例。

当然,you can also use BEGIN; in MySQL 启动事务,这在 SQLite 和 SQL Server 中可以正常工作。你可以改用它。

您通常能够找到自己喜欢的且相当便携的语法,但如果您不必考虑它,为什么还要花时间和精力去考虑它呢?充分利用 a dozen PDO drivers 的优势,让您的生活更轻松。如果您完全关心一致性,请选择 API 而不是特定于实现的 SQL 语法。

【讨论】:

【参考方案2】:

PDO 和 mysql 事务没有什么区别。除了

例如,您可以开始您的事务,让一些查询运行一些 php 代码根据您的代码执行更多查询等,您可以在该代码的末尾回滚,只需执行 $PDO->rollback(); 这比创建 2 更容易- 多 3 个查询,而不是使用 $pdo->beginTransaction();

同样使用$pdo->rollback(); 会缩短几行,在我看来,它也比创建另一个查询并执行它更清晰。

【讨论】:

那些模拟交易有时很有用,但有时您需要获取结果,例如事务中查询的最后插入 id。

以上是关于PDO 事务函数与 MySQL 事务语句?的主要内容,如果未能解决你的问题,请参考以下文章

PDO / PHP / MySQL 中的性能:事务与直接执行

86)PHP,PDO常用函数

PDO如何完成事务操作

PHP中的MySQLi扩展学习mysqli的事务与预处理语句

PHP PDO MySQL 以及它如何真正处理 MySQL 事务?

PHP中的MySQLi扩展学习mysqli的事务与预处理语句