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 函数。
从可移植性的角度来看,你最好使用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();
也短了几行,在我看来,这也比创建另一个查询并执行它更清晰。