nodejs пул транзакций mssql - PullRequest
0 голосов
/ 21 января 2019

У меня есть модуль для машинописи.

public multipleQuery(queries: string[]) {
    return new Promise(async (resolve, reject) => {
      const cPool = new sql.ConnectionPool(this.room.db);
      await cPool.connect().then((pool: any) => {
        const transaction = new sql.Transaction(pool);
        return transaction.begin(async (err: any) => {
          const request = new sql.Request(transaction, { stream: true });
          try {
            queries.forEach(async (q) => {
              await request.query(q);
            });
            transaction.commit((err2: any) => {
              pool.close();
              if (err2) {
                reject(err2);
              } else {
                resolve(true);
              }
            });
          } catch (err) {
            transaction.rollback(() => {
               pool.close();
               reject(err);
            });
          }
        });
      }).catch((err: Error) => {
        cPool.close();
        reject(err);
      });
    });
}

queries переменная представляет собой массив строк, я поместил в большое количество запросов вставки SQL. Независимо от того, что я пишу в запросах, я все равно получаю эту ошибку, почему?

RequestError: Запросы могут быть сделаны только в состоянии LoggedIn, а не в Состояние SentClientRequest TransactionError: Невозможно получить соединение для запрос. Идет другой запрос.

1 Ответ

0 голосов
/ 23 января 2019

решение использовать async

const async = require("async");

public multipleQuery(queries: string[]) {
return new Promise((resolve, reject) => {
  const pool = new sql.ConnectionPool(this.room.db);
  return pool.connect().then((p: any) => {
    const transaction = new sql.Transaction(p);
    return transaction.begin((err: any) => {
        const request = new sql.Request(transaction);
        if (err) {
          reject(err);
        }
        return async.eachSeries(queries, async (query: any, callback: any) => {
            return request.query(query);
          }, async (err2: any) => {
            if ( err2 ) {
              await transaction.rollback(() => {
                pool.close();
                reject(err2);
              });
            } else {
              await transaction.commit(() => {
                pool.close();
                resolve(true);
              });
            }
          });
      });
  });
});
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...