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 TRANSACTION
和 COMMIT
)将导致抛出异常。因此,为了使用带有预准备语句的事务,您必须使用第一种情况中显示的 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 中的性能:事务与直接执行
PHP中的MySQLi扩展学习mysqli的事务与预处理语句