MySQL и транзакции не откатываются - PullRequest
3 голосов
/ 10 ноября 2010

Я пишу процедуру импорта и хочу, чтобы при импорте произошел сбой всего импорта. Я использую базу данных MySQL, которая установлена ​​на InnoDB, и страницу asp для управления импортом. Я хочу начать транзакцию, а затем выполнить откат, если произошла ошибка, или зафиксировать, если она прошла успешно. Моя проблема заключается в том, что при возникновении ошибки в строке 4 первые 3 записи сохраняются в базе данных, а не откатываются.

Вот пример моего кода: -

        MySqlConnection conn = new MySqlConnection(connStr);
        conn.Open();

        MySqlCommand cmd = new MySqlCommand();

        MySqlTransaction tran = conn.BeginTransaction();

        cmd.Connection = conn;
        cmd.Transaction = tran;

        int ErrorCount = 0;
        do while read from file{
            try{
                if (fail validate){
                    ErrorCount ++;
                    break;
                }
                run store procedure 1 which does insert
                run store procedure 2 which does insert
            }
            catch (exception e){
                ErrorCount ++;
                break;
            }
        }

        if (ErrorCount == 0){
            tran.Commit();
        }
        else{
            tran.RollBack();
        }

        if (conn != null) conn.Close();

Я прочитал об автокоммите и о том, как его настроить в базе данных. Единственная проблема заключается в том, что если он отключен, как это повлияет на все другие вставки в базу данных, для которых еще не установлены транзакции. Также не вижу как включить или выключить автокоммит с c #.

Кто-нибудь знает, как откатить мои транзакции?

Спасибо Шерил

Ответы [ 5 ]

1 голос
/ 20 марта 2013

Если в ваших хранимых процедурах есть транзакции или операторы с неявными коммитами, то это произойдет.

0 голосов
/ 17 мая 2015

У меня была похожая проблема.Хранимая хранимая процедура в свою очередь вызвала другую хранимую процедуру, которая имела строки START TRANSACTION и COMMIT.После того, как я удалил эти команды, зафиксированный работал как ожидалось.

0 голосов
/ 10 ноября 2010

Вы проверили механизм хранения для этой таблицы? Я знаю, что ваш db по умолчанию равен innoDB, но я раньше как-то создавал таблицы MyISAM в среде такого типа.

SHOW CREATE TABLE tablename
0 голосов
/ 10 ноября 2010

Я считаю, что Autocommit для каждой команды, поэтому он не совсем справится с вашей ситуацией. Я думаю, что ключ заключается в том, чтобы каждый хранимый вызов proc был новой командой, добавляемой в транзакцию. Я не склонен использовать MySQL, но я успешно использовал следующий код на OleDb.

OleDbConnection conn = new OleDB(); //obviously missing important stuff...
conn.open();

using(OleDbTransaction trans = conn.BeginTransaction()){
    try{
        OleDbCommand cmd1 = new OleDbCommand("insert into t1...", conn, trans);
        cmd1.ExecuteNonQuery();

        OleDbCommand cmd2 = new OleDbCommand("insert into t2...", conn, trans);
        cmd2.ExecuteNonQuery();

        trans.Commit();
    } catch {
        trans.Rollback();
    }
}

conn.close();
0 голосов
/ 10 ноября 2010

Вы можете отключить автокоммит только для вашего сеанса. Попробуйте выполнить sql "set autocommit = 0"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...