Совершает ли сбой 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);
?>
Author: user2332467, 2016-05-05

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 */
 1
Author: Your Common Sense, 2016-05-05 04:50:31