Я хочу выполнить транзакции в 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, что вызывает ошибку дублирования индекса. Сделка отменяется, но проблема в том, что вторая вставка, которая находится вне транзакции, не выполняется. Ошибка не регистрируется, и - что странно для меня - когда я выбираю целую таблицу сразу после этой второй вставки, в результатах появляется новая строка. Но в других связях он исчезает. Таким образом, похоже, что в конце соединения вновь созданная строка удаляется. Проблема не возникает при совершении транзакции.
Ваш второй INSERT INTO
может выполнить перед вашим ROLLBACK
в первом INSERT INTO
поскольку он выполняется за пределами обратного вызова. Когда это происходит, вторая вставка также возвращается, потому что вы используете одно соединение. Переместите вторую вставку внутри обратного вызова первого, чтобы сериализовать вещи.