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

Nat*_*ate 8 php mysql pdo transactions

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

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

有没有理由使用PDO函数而不是简单地使用MySQL中的事务语句?即:

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

更新:只是给其他人调查这个,经过一些测试我实际上发现上面的第二个案例(使用START TRANSACTIONCOMMITprepare())将导致抛出异常.因此,为了将事务与预准备语句一起使用,必须使用第一种情况中显示的PDO函数.

Air*_*Air 10

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

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

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

你经常能够找到一个你喜欢的语法,并且它具有合理的便携性,但是如果你不需要的话,为什么要花时间和精力去思考呢?充分利用这样一个事实,即有十几个PDO驱动程序可以让您的生活更轻松.如果您完全关心一致性,那么支持API而不是特定于实现的SQL语法.