Это кажется достаточно простым вопросом, но я не смог найти никаких конкретных ответов, специфичных для 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()
, который, по-видимому, автоматически откатывает транзакцию (?), но что, если мне нужно продолжить работу и, возможно, выполнить больше операций по изменению базы данных позже? Если эта фиксация не удалась и у меня не было этого отката, включился бы автокоммит (который в соответствии с этот прокомментируйте запись руководства по PHP на autocommit
делает совершать ожидающие операции) или даже явно вызывать другого $mysqli->commit()
позже попытаться снова зафиксировать предыдущие вставки, так как раньше они не выполнялись, и они не были отменены?
Я надеюсь, что я был достаточно ясен, и что я могу получить окончательный ответ на этот вопрос, который доставлял мне немало хлопот.
Изменить: ОК, возможно я неправильно сформулировал свой вопрос в этой строке комментария. На самом деле это не вопрос того, необходимость откат, который, как было указано, будет зависеть от моего варианта использования, но на самом деле каков эффект иметь или не иметь откат в этой строке. Возможно, более простой вопрос был бы: провалился ли commit
call отбрасывает ожидающие операции или просто оставляет их в состоянии ожидания, ожидая отката или другого коммита?
Задача ещё не решена.
Других решений пока нет …