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

PDO transaction functions vs MySQL transaction statements?

提问人:Nate 提问时间:12/13/2014 最后编辑:Nate 更新时间:12/26/2014 访问量:940

问:

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

更新:只是给其他任何对此进行调查的人的注意,经过一些测试,我实际上发现上面的第二种情况(using 和 in)将导致抛出异常。因此,为了将事务与预准备语句一起使用,您必须使用第一种情况中所示的 PDO 函数。START TRANSACTIONCOMMITprepare()

php mysql PDO 事务

评论


答:

2赞 Stijn Bernards 12/16/2014 #1

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

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

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

评论

0赞 Zaffy 12/21/2014
这些模拟事务有时很有用,但有时您需要从事务中的查询中获取结果,例如最后插入 ID。
10赞 Air 12/17/2014 #2

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

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

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

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