как я могу отключить автоматическую фиксацию программно в mysql с помощью javascript / nodejs и mysql npm?

#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#transactions

2. Я могу вручную отключить его в 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");