Как выполнить динамическое количество запросов в транзакции с использованием NodeJS и Microsoft SQL Server - PullRequest
0 голосов
/ 10 октября 2019

Я настраиваю API для взаимодействия с моим приложением React и базой данных Microsoft SQL Server. У меня есть функция, которая должна удалять записи, и вставлять переменное количество записей после. Мне нужно, чтобы это было сделано в транзакции. Как мне сделать это с помощью пакета узла mssql?

Я перепробовал много, если не все сообщения, которые мне удалось найти через Google.

Документация для mssqlпакету очень не хватает, поэтому, хотя у меня есть базовая структура, они не охватывают никаких конкретных примеров того, как сделать то, что я пытаюсь сделать (или что-нибудь в этом отношении).

Документация дляmssql транзакций можно найти здесь

И я попробовал следующее:

async.each

Разрешение массива запросов

async и async.eachSeries

Используя некоторые из приведенных выше примеров. Я сталкиваюсь с ошибками, говоря, что он не может выполнить коммит, потому что есть запросы, которые все еще разрешаются, и это то, что я хочу, но они не должны получать коммит до того, как они разрешат ..

Мой текущий код выглядит так:

  let statements = ['DELETE FROM ...', 'INSERT INTO ...', 'INSERT INTO ...', ...]

  const transaction = new sql.Transaction(db);
  transaction.begin(err => {
    if(err)
    {
      res.sendStatus(500);
      return console.error('Error in begin', err);
    }

    const request = new sql.Request(transaction);

    async.eachSeries(statements, (statement, next) => {

      request.query(statement, err => {
        if(err) return next(err);
        next();
      });

    }, err => {
      if(err)
      {
        console.error('Error in queries, rolling back', err);
        res.sendStatus(500);
        return transaction.rollback();
      }

      transaction.commit(err => {
        if(err) return console.error('Error in commit', err);
        else
        {
          console.log('Done?');
          res.sendStatus(200);
        }
      });

    });
  });

Основной процесс, который я пытаюсь выполнить:

  1. Удалить все записи, где два поля равны некоторым параметрам, которые я получаю из внешнего интерфейса
  2. Вставка новых записей с использованием объектов, которые я получаю из внешнего интерфейса
  3. Отправка состояния ответа внешнему интерфейсу в случае успеха или неудачи

В настоящее время выполняется оператор DELETE, но ответ отправляет обратно 200 почти сразу, прежде чем разрешится любой из асинхронных вызовов. Я знаю это, потому что, если я принудительно закрываю внешний интерфейс, я получаю ошибки, в которых говорится о неразрешенных обещаниях и т. Д. Кроме того, на моем бэкенде я вижу, что данные были удалены, но не вставлены. 1046 *

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