Транзакции 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, время: 21:42. |