Совершает ли сбой mysqli автоматический откат?
У меня есть несколько вопросов о том, как работает этот код из руководства по PHP. Я вижу другие примеры, которые создают исключения (обычно объектно-ориентированный код) или используют флаги для отслеживания сбоев каждого отдельного запроса.
Мой вопрос в том, почему вам нужно отмечать ошибки и проверять наличие флага, прежде чем принимать решение о фиксации или откате. Глядя на приведенный ниже пример, кажется, что если фиксация не сработает, ни один из запросов все равно не будет зафиксирован.
Я также заметил, что они просто просто выйдите при сбое фиксации. Это автоматически откатывает все назад?
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "test");
/* check connection */
if (!$link) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
/* set autocommit to off */
mysqli_autocommit($link, FALSE);
mysqli_query($link, "CREATE TABLE Language LIKE CountryLanguage");
/* Insert some values */
mysqli_query($link, "INSERT INTO Language VALUES ('DEU', 'Bavarian', 'F', 11.2)");
mysqli_query($link, "INSERT INTO Language VALUES ('DEU', 'Swabian', 'F', 9.4)");
/* commit transaction */
if (!mysqli_commit($link)) {
print("Transaction commit failed\n");
exit();
}
/* close connection */
mysqli_close($link);
?>
1 answers
Глядя на приведенный ниже пример, кажется, что если фиксация не сработает, ни один из запросов все равно не будет зафиксирован.
Верно.
Но дело в том, что ошибка может произойти не только при фиксации., но - что еще более вероятно - при выполнении одного из запросов. Поэтому вам нужно проверить не только результат фиксации, но и результат каждого запроса и прервать всю операцию.
Итак, ваш вопрос должен читаться как
Происходит ли автоматический откат сбоя mysqli?
И ответ "да и нет".
По умолчанию этого не произойдет.
Но если вам удастся прервать свой скрипт при сбое запроса, ссылка будет закрыта, и транзакция будет автоматически откатана. Приведенный ниже код преобразует ошибки mysql в фатальные ошибки PHP, которые автоматически выполнят откат, если один из запросов не удался.
<?php
/* set the proper error reporting mode */
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect("localhost", "my_user", "my_password", "test");
/* set autocommit to off */
mysqli_autocommit($link, FALSE);
/* Run your queries */
mysqli_query($link, "CREATE TABLE Language LIKE CountryLanguage");
mysqli_query($link, "INSERT INTO Language VALUES ('DEU', 'Bavarian', 'F', 11.2)");
mysqli_query($link, "INSERT INTO Language VALUES ('DEU', 'Swabian', 'F', 9.4)");
/* commit transaction */
mysqli_commit($link);
/* this is the last line, NO other code is needed */