这似乎是一个简单的问题,但我找不到任何特定于MySQL的确定答案。看看这个:
$mysqli->autocommit(false); //Start the transaction
$success = true;
/* do a bunch of inserts here, which will be rolled back and
set $success to false if they fail */
if ($success) {
if ($mysqli->commit()) {
/* display success message, possibly redirect to another page */
}
else {
/* display error message */
$mysqli->rollback(); //<----------- Do I need this?
}
}
$mysqli->autocommit(true); //Turns autocommit back on (will be turned off again if needed)
//Keep running regardless, possibly executing more inserts
问题是,我看到的大多数示例只是在提交失败时结束脚本,或者通过让它完成或显式调用exit()
,显然自动回滚事务(?),但是如果我怎么办?需要继续运行并可能在以后执行更多数据库更改操作?如果此提交失败并且我没有在那里进行回滚,则会重新启用自动提交(根据this对autocommit
上的PHP手册条目的评论提交待决操作)或甚至稍后显式调用另一个$mysqli->commit()
,尝试再次提交先前的插入,因为它之前失败并且它们没有回滚?
我希望我已经足够清楚了,我可以得到一个明确的答案,这一直困扰着我。
编辑:好的,也许我在那一行评论中说错了我的问题。这不是我是否需要回滚的问题,正如我们所指出的那样,这将取决于我的用例,但实际上是什么影响是否在该行中进行了回滚。也许一个更简单的问题是:失败的commit
调用是否会丢弃挂起的操作,还是只是让它们处于挂起状态,等待回滚或其他提交?