Запросы не выполняются после отката транзакции

0

Я хочу выполнить транзакции в node-mysql (путем выполнения запросов START TRANSACTION, ROLLBACK, COMMIT). У меня есть этот код:

conn.query("START TRANSACTION");
conn.query("INSERT INTO users (id, name, age) VALUES (1, 'Mat', '24')", function(e){
    if (e){
        conn.query("ROLLBACK", callback);
    }
    else{
        conn.query("COMMIT", callback);
    }
});

conn.query("INSERT INTO users (name, age) VALUES ('Mat', '24')", function(e, r){
    console.log(e); // null
    console.log(r); // {fieldCount: 0, affectedRows: 1, insertId: 2, serverStatus: 3, warningCount: 0, message: ''}
});

Чтобы проверить случай отката, я намеренно установил id равным 1, что вызывает ошибку дублирования индекса. Сделка отменяется, но проблема в том, что вторая вставка, которая находится вне транзакции, не выполняется. Ошибка не регистрируется, и - что странно для меня - когда я выбираю целую таблицу сразу после этой второй вставки, в результатах появляется новая строка. Но в других связях он исчезает. Таким образом, похоже, что в конце соединения вновь созданная строка удаляется. Проблема не возникает при совершении транзакции.

Теги:
transactions
node-mysql

1 ответ

1
Лучший ответ

Ваш второй INSERT INTO может выполнить перед вашим ROLLBACK в первом INSERT INTO поскольку он выполняется за пределами обратного вызова. Когда это происходит, вторая вставка также возвращается, потому что вы используете одно соединение. Переместите вторую вставку внутри обратного вызова первого, чтобы сериализовать вещи.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню