【发布时间】:2014-07-14 02:52:24
【问题描述】:
PHP PDO::commit() 文档指出该方法在成功时返回 TRUE,在失败时返回 FALSE。这是指beginTransaction()和commit()之间的语句执行成功还是失败?
例如,来自文档:
$dbh->beginTransaction();
$sql = 'INSERT INTO fruit (name, colour, calories) VALUES (?, ?, ?)';
$sth = $dbh->prepare($sql);
foreach ($fruits as $fruit) {
$sth->execute([
$fruit->name,
$fruit->colour,
$fruit->calories,
]);
}
$dbh->commit();
如果上述任何一个执行失败,commit() 方法是否会由于原子事务的“全有或全无基础”而返回 false?
【问题讨论】:
-
我真的不记得需要在代码库中提交,您是否尝试过不使用它?
-
我不确定我是否理解。手动事务的重点是确保多个语句要么全部成功,要么都不成功。
-
我觉得你想多了。如果在这种情况下失败,那么很可能所有人都会失败,反之亦然。只需在代码中添加适当的错误处理,如果您真的担心失败的原因,只需将其记录下来。我从来没有在服务器端代码中使用过提交,我发现你不太可能这样做。
-
这是文档中的场景。我将使用手动事务的一个示例是从一个表中删除,然后从另一个表中删除。如果其中一个删除失败,另一个也应该失败。因此,如果第一个成功而第二个失败,则应回滚第一个,否则数据库中的数据将处于“中间”状态。这就是我需要手动交易的原因。
-
很公平。另一种解决方法是执行每个 $fruit ,如果失败,则删除以前插入的,但我知道这不是“自然的”。
标签: php mysql pdo transactions