PDO事务函数与MySQL事务语句



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 函数。

从可移植性的角度来看,你最好使用PDO提供的接口,以防你想使用不同的DBMS,或者引入另一个习惯于另一个DBMS的团队成员。

例如,SQLite

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

当然,您也可以在MySQL中使用BEGIN;来启动事务,这在SQLite和SQL Server中可以正常工作。你可以改用它。

通常能够找到一种你喜欢的语法,并且是相当可移植的,但是如果你没有必要,为什么要花时间和精力去考虑它呢?利用有十几个PDO驱动程序可用的事实,让您的生活更轻松。如果您完全关心一致性,请优先使用 API,而不是特定于实现的 SQL 语法。

PDO和mysql事务之间的区别不大。除了

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

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

最新更新