Ben*_*est 8 php mysql pdo transactions
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();
Run Code Online (Sandbox Code Playgroud)
如果上述任何执行失败,由于原子事务的"全有或全无"基础,commit()方法是否会返回false?
返回值基于 pdo::commit 本身,而不是您尝试提交的事务。当没有事务处于活动状态时,它会返回 FALSE,但何时应该返回 TRUE 或 FALSE 并不太清楚。
事务本身内执行的查询将自行成功或失败。使用 Mr.Tk 的示例,如果可能并且在“try”块中执行查询时没有发生错误,则将提交事务;如果“try”块中确实发生错误,则将回滚事务。
当仅评估“try”块中执行的查询时,我个人会尝试捕获 PDOException 而不是普通的异常。
$dbh->beginTransaction();
try {
// insert/update query
$dbh->commit();
} catch (PDOException $e) {
$dbh->rollBack();
}
Run Code Online (Sandbox Code Playgroud)
关键部分是将PDO设置为异常模式,而不必使用try-catch来执行回滚.因此,您的代码是正确的,如果您想要的只是在某个地方有这条线路,则无需更改它:
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
Run Code Online (Sandbox Code Playgroud)
如果失败,脚本将被终止,连接关闭,mysql将很乐意为您回滚事务.
如果你仍然想手动回滚,你应该正确地做,不像在其他答案中说的那样.确保这一点
Exception,不是PDOException,因为什么特殊的异常中止了执行并不重要这份清单来自我的文章,你可能会发现这个或许多其他方面都有用.
| 归档时间: |
|
| 查看次数: |
7279 次 |
| 最近记录: |