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

时间:2014-12-13 12:47:13

标签: php mysql pdo transactions

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

更新:只是给其他人调查一下,经过一些测试,我实际上找到了上面的第二个案例(在{{1}中使用START TRANSACTIONCOMMIT })将导致抛出异常。因此,为了使用准备好的语句进行交易,必须使用第一种情况下显示的PDO函数。

2 个答案:

答案 0 :(得分:10)

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

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

当然,you can also use BEGIN; in MySQL可以启动一个事务,并且可以在SQLite和SQL Server中正常运行。你可以改用它。

你经常能够找到一个你喜欢的语法,并且这个语法相当便携,但是如果你不需要的话,为什么要花时间和精力去思考呢?充分利用a dozen PDO drivers可以让您的生活更轻松的事实。如果您完全关心一致性,那么支持API而不是特定于实现的SQL语法。

答案 1 :(得分:2)

PDO和mysql事务之间的区别是什么。除非

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

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