что происходит с отключенной автоматической фиксацией, и откат никогда не происходит? - PullRequest
1 голос
/ 15 февраля 2012

Итак, я унаследовал большую базу кода на С ++, которая выполняет большую часть работы с MySQL. Код всегда отключает автокоммит и, как правило, имеет функции, которые выглядят следующим образом:

int function() {
    if(mysql_real_query(conn, ...)) {
        return -1;
    }

    if(mysql_real_query(conn, ...)) {
        return -1;
    }

    mysql_commit(conn);
    return 0;
}

Очевидно, здесь подразумевается, что фиксация происходит только в том случае, если запросы успешны. Но что произойдет, если один из них нет? В конце концов, соединение mysql правильно закрыто, но в коде нет отката.

Так что, когда он закроется, он просто внесет какие-либо изменения, которые были успешными? Или будет откат, как будто ничего не случилось?

Моя интуиция говорит, что имеет смысл иметь откат, если второй запрос не выполнен, чтобы "отменить" успешный первый запрос. Таким образом, эта функция оказывается транзакционной.

Конечно, я считаю, что этот код по своей сути нарушен, потому что позже другой код mysql может выполнить коммит, оставив вещи в "странном" состоянии, если какая-то предыдущая работа не удалась. Но прежде чем перейти к изменению поведения программы, я хотел убедиться, что я понимаю, каково текущее поведение.

1 Ответ

1 голос
/ 15 февраля 2012

Как сказал Марк Б, это на самом деле достаточно легко проверить. Я надеялся, что кто-нибудь сможет указать на авторитетный источник, но тестирование кажется достаточно разумным:

Так или иначе, я попробовал следующий код:

MYSQL *conn = mysql_init(NULL);
mysql_real_connect(conn, host, use, password, database, 0, NULL, 0);
mysql_autocommit(conn, 0);
mysql_query(conn, "INSERT INTO test VALUES(1)");
mysql_query(conn, "INSERT INTO test VALUES(2)");
mysql_query(conn, "INSERT INTO test VALUES(3)");
mysql_query(conn, "INSERT INTO test VALUES(4)");
mysql_close(conn);

достаточно просто, отключите авто-фиксацию, сделайте кучу вставок и никогда не фиксируйте. В этом случае результатом является то, что запросы эффективно откатываются . Когда я запрашиваю БД, строк там нет.

Очевидно, что простое добавление mysql_commit(conn); непосредственно перед mysql_close(conn); фактически приводит к созданию строк.

...