Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   Транзакции MSSQL async/await (https://javascript.ru/forum/node-js-io-js/78621-tranzakcii-mssql-async-await.html)

sniffysko 10.10.2019 17:37

Транзакции MSSQL async/await
 
Прошу подсказать, если кто знает. На пишу класс, который должен поддерживать транзакции на MSSQL. Вот пример кода:

async queryTransact(q, params){
    try {
        const transaction = new sql.Transaction(this._pool);
        await transaction.begin();
        const request = new sql.Request(transaction);
        request.input('id', 100);
        const result = await request.query(q);
        await transaction.commit();
        return Promise.resolve(result);
    }catch(err){
        await transaction.rollback();
        console.log("Error", err);
        return Promise.reject(err);
    }
}

Правильно ли я отрабатываю транзакцию и rollback?
Т.к. нормальной документации по этому вопросу я не нашел. Все примеры предлагают callback подход.

SuperZen 11.10.2019 13:09

const transaction = new sql.Transaction(this._pool);

не в scope в catch - будет ошибка

sniffysko 11.10.2019 18:15

Немного не понял вашего замечания.
Пример вероятно несколько некорректный, поскольку queryTransact -- метод класса. И this относится к классу. А переменная _pool инициируется в конструкторе. Можно наверное привести пример всего класса, но меня волновало именно правильно ли я отрабатываю rollback. Я на 90% уверен, что не правильно. :о)

Audaxviator 13.10.2019 19:11

Если метод (функция) не прмисифицирован, то засовывать его в async-функцию бессмысленно - оно работать там не может, даже если перед ним пять раз написать await.
Если в документации модуля имеются примеры только с callback-функциями - это наверняка значит, что методы не промисифицированы.
Теоретически существует утилита для промисификации непромисифицированных методов - (тырц)

sniffysko 15.10.2019 10:24

Промисификация
 
Дело как раз в том, что методы у них промисифицированы. Точнее так: если есть каллбэк -- идум на каллбек, иначе промис. Например код ф-ции transaction.begin:
begin (isolationLevel, callback) {
    if (isolationLevel instanceof Function) {
      callback = isolationLevel
      isolationLevel = undefined
    }

    if (typeof callback === 'function') {
      this._begin(isolationLevel, err => {
        if (!err) {
          this.emit('begin')
        }
        callback(err)
      })
      return this
    }

    return new PromiseLibrary((resolve, reject) => {
      this._begin(isolationLevel, err => {
        if (err) return reject(err)
        this.emit('begin')
        resolve(this)
      })
    })
  }

Примеры же, да, используют подход каллбэков. Но, встречаются и примеры await. Что говорит о том, что ребята пошли по пути покрытия двух подходов.

Audaxviator 15.10.2019 19:23

Значит, всё нормально.


Часовой пояс GMT +3, время: 01:08.