Транзакции 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 подход. |
const transaction = new sql.Transaction(this._pool); не в scope в catch - будет ошибка |
Немного не понял вашего замечания.
Пример вероятно несколько некорректный, поскольку queryTransact -- метод класса. И this относится к классу. А переменная _pool инициируется в конструкторе. Можно наверное привести пример всего класса, но меня волновало именно правильно ли я отрабатываю rollback. Я на 90% уверен, что не правильно. :о) |
Если метод (функция) не прмисифицирован, то засовывать его в async-функцию бессмысленно - оно работать там не может, даже если перед ним пять раз написать await.
Если в документации модуля имеются примеры только с callback-функциями - это наверняка значит, что методы не промисифицированы. Теоретически существует утилита для промисификации непромисифицированных методов - (тырц) |
Промисификация
Дело как раз в том, что методы у них промисифицированы. Точнее так: если есть каллбэк -- идум на каллбек, иначе промис. Например код ф-ции 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. Что говорит о том, что ребята пошли по пути покрытия двух подходов. |
Значит, всё нормально.
|
Часовой пояс GMT +3, время: 01:08. |