事务:commit()vs rollBack()

时间:2016-06-04 17:40:29

标签: php mysql pdo transactions

我在一个脚本上有一些查询,我想要执行所有这些查询或者都不执行任何查询。我已经搜索了这个,我发现我必须使用交易

其实我想使用PDO::beginTransaction。现在有两种方法。

那么它们之间的区别是什么?他们两个看起来都和我一模一样,所以我什么时候应该使用哪一个?

<?php

$dbh->beginTransaction();

$sth1 = $dbh->exec("DROP TABLE fruit");
$sth2 = $dbh->exec("UPDATE dessert SET name = 'hamburger'");
$sth3 = $dbh->exec("INSERT INTO names(id, name) VALUES (NULL, 'peter')");

// which one?
$dbh->commit();
// or
$dbh->rollBack();
// ??

/* Database connection is now back in autocommit mode */
?>

2 个答案:

答案 0 :(得分:0)

您使用commit来执行事务,而回滚是相反的,当您希望保持所有状态不变时使用回滚(例如,如果您在事务的某个步骤中检测到某些错误)。

答案 1 :(得分:0)

  

他们两个似乎与我相同

那是错的。根据定义,事务Atomic本质上意味着它将发生并成功执行组中的所有命令或根本不执行任何命令。如果它成功并且您希望保持更改,那么COMMIT如果组中的任何语句失败,则ROLLBACK将返回到原始状态。

所以在你的情况下,你会希望所有下面的语句成功执行,如果然后COMMIT继续更改,但如果任何语句因任何所谓的原因而失败,那么它可能最终会给出一个不想要的结果,你不想坚持,所以ROLLBACK并回到以前的一致状态。

$sth1 = $dbh->exec("DROP TABLE fruit");
$sth2 = $dbh->exec("UPDATE dessert SET name = 'hamburger'");
$sth3 = $dbh->exec("INSERT INTO names(id, name) VALUES (NULL, 'peter')");

了解Transaction并查看另一篇帖子PHP + MySQL transactions examples