Действительно ли реляционные базы данных, такие как Knex, используют асинхронный ввод-вывод на NodeJS? - PullRequest
0 голосов
/ 23 апреля 2020

Я читал, что системы управления реляционными базами данных, RBDMS, не годятся для NodeJS неблокирующей модели ввода-вывода. Основная причина в том, что соединения и транзакции RBDMS находятся в состоянии.

Я играл с NodeJS, PostgreSQL и Knex некоторое время. Knex позволяет мне написать что-то вроде этого:

      await knex.transaction(async (trx) => {
        const _id = await trx.insert(data)
                             .into('customer')
                             .returning('id');

        const customer_id = parseInt(_id[0]);

        await trx.insert({
            'customer_id': customer_id,
            'created_at' : new Date(),
            'op' : 'customer_creation'
            })
          .update({customer_id : customer_id})
          .into('customer_history');
      });

Делаете ли вы, если вызовы Knex await действительно используют реальный неблокирующий ввод-вывод? Или он использует какой-то хак под капотами?

привет!

Иван

1 Ответ

0 голосов
/ 23 апреля 2020

Я не уверен во всех RBDMS, которые поддерживает knex, но поскольку PostGres & MySQL являются асинхронными c (они реализуют какой-то протокол связи между вашим узлом и сервером БД), поэтому он использует асин * c характер Node.js.

Вы можете легко проверить это, используя asCallback вместо Promise API.

knex
  .transaction(async (trx) => {
    console.log('1');
    trx
      .insert(data)
      .into('customer')
      .returning('id')
      .asCallback(function (err, rows) {
        rows;
      });
    console.log('2');
  })
  .asCallback(function (err, rows) {
    console.log('3');
  });
console.log('4');

И убедитесь, что первым console.log будет 4, это означает, что задача поставлена ​​в очередь в событии l oop ->, что означает, что она была асин c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...