Узел js mysql работает синхронно (странное поведение)

#mysql #node.js #asynchronous

Вопрос:

Хорошо, нужна помощь.

Есть приложение на узле js и mysql. Я не совсем понимаю поведение связей.

Вот мой код (его часть).

 let connection = mysql.createConnection({
    host: "localhost",
    database: "mans",
    user: 'root',
    password: '',
}).promise();

let results = [
    // array of objects
];

await Promise.all(
    results.map(r=>{
        return connection.query("UPDATE `table` SET `name` = ?, WHERE `id` = ?", [r.name, r.id]).then(r=>{
            console.log('end iteration');
        }).catch(err=>{
            console.log('err: ', err);
        });
    })
)   
 

Теперь, когда map функция запускается (конечно, aync, как ожидается), она query работает как простая функция синхронизации! Ну, может быть, это потому, что я не использую пулы. Поэтому я переписываю его заново.

 let pool = mysql.createPool({
    connectionLimit: 100,
    host: "localhost",
    database: "mans",
    user: 'root',
    password: '',
}).promise();

let results = [
    // array of objects
];

await Promise.all(
    results.map(r=>{
        return pool.getConnection().then(connection=>{
            console.log('opened connection');
            return connection.query("UPDATE `table` SET `name` = ?, WHERE `id` = ?", [r.name, r.id]).then(r=>{
                connection.release();
                console.log('end iteration');
                return;
            }).catch(err=>{
                console.log('err: ', err);
            });
        }).catch(err=>{
            console.log('err: ', err);
        });
    })
)   
 

Событие открытия соединения сработало асинхронно и успешно, но обновления все еще ждут друг друга. Что я делаю не так?

Комментарии:

1. Ладно, кое-какие новости. Пробовал использовать START TRANSACTION и COMMIT команды. И на моем локальном сервере Windows это работает, все операции идут асинхронно. Без этого все было синхронно. Но он не работал на сервере с Ubuntu 18.04 и mysql 5.7. Операции все еще синхронизировались. Обновление за обновлением. Проверил двигатель, он был InnoDB

Ответ №1:

Наконец-то я получил какой-то результат. Но для меня это не имеет никакого смысла. Если кто-нибудь может это прояснить, пожалуйста, сделайте это.

Моя проблема решена с помощью добавления INDEX в ID поле (было без него) в WHERE заявлении. С START TRANSACTION функциями и функциями он начал работать синхронно. COMMIT

Опять же, без него или без индекса по идентификатору, обновление работало синхронизировано — только когда заканчивался предыдущий.

Комментарии:

1. Возможно, он не меняется на асинхронный, но теперь обновление происходит так быстро, что вы не можете заметить разницу.

2. Ладно, ты прав. Я сделал еще один тест, и да, он был быстрым, но все равно один за другим. Но тогда мой вопрос все еще открыт, почему он не работает так синхронно, как я хочу?