#javascript #mysql #node.js
#javascript #mysql #node.js
Вопрос:
Я использую транзакции в функции с использованием nodejs и mysql npm. в настоящее время транзакция не работает, если при вставке возникает ошибка, запрос на удаление ранее выполняется, и я теряю строку — я предполагаю, что причина в том, что mysql поставляется с уже включенной автоматической фиксацией. есть ли способ отключить автоматическую фиксацию через javascript программно?
const mysql = require('mysql')
const config = require('../config')[process.env.NODE_ENV || 'development']
const dbConfig = {
connectionLimit: 10,
host: config.database.host,
user: config.database.user,
password: config.database.password,
database: config.database.database,
}
const pool = mysql.createPool(dbConfig);
const connection = () => {
return new Promise((resolve, reject) => {
pool.getConnection((err, connection) => {
if (err) {
reject(err);
}
const query = (sql, binding) => {
return new Promise((resolve, reject) => {
connection.query(sql, binding, (err, result) => {
if (err) {
reject(err);
}
resolve(result);
});
});
};
const release = () => {
return new Promise((resolve, reject) => {
if (err) {
reject(err);
}
resolve(connection.release());
});
};
resolve({ query, release });
});
});
};
const query = (sql, binding) => {
return new Promise((resolve, reject) => {
pool.query(sql, binding, (err, result, fields) => {
if (err) {
reject(err);
}
resolve(result);
});
});
};
module.exports = { pool, connection, query };
и это моя функция:
const connection = await db.connection();
try {
await connection.query("START TRANSACTION");
await db.query('delete from X where id=?', [bar.id]);
await db.query('INSERT INTO X (...) values (...)
.
await connection.query("COMMIT");
} catch(e) {}
Комментарии:
1. Вы пробовали использовать руководство для
mysql
этого ? npmjs.com/package/mysql#transactions2. Я могу вручную отключить его в mysql, но мне интересно, есть ли способ сделать это через javascript, чтобы нам не приходилось иметь дело с этим через базу данных
Ответ №1:
Вы запрашиваете из своего пула, а не из соединения / клиента, где вы запускаете транзакцию и фиксируете.
Изменить db.query
на connection.query
const connection = await db.connection();
try {
await connection.query("START TRANSACTION");
await connection.query('delete from X where id=?', [bar.id]);
await connection.query('INSERT INTO X (...) values (...)
await connection.query("COMMIT");