如果使用函数,如何在knex中实现事务? util.insert在table2上调用knex,类似于util.mark。
knex('tab1').where({ col1: 'val1' }).update({ col2: 'val2'}).returning('col3').then(function(result1) {
if (result1 != 0) {
var data2 = {
"key": "value"
};
util.insert(data1, function(err1, data2) {
if (err1) {
cb(err1);
return;
}
util.mark(data2, function(err2, data3) {
if (err2) {
cb(err2);
return;
}
cb(null, true);
return;
});
});
} else {
cb(null, false);
}
})
答案 0 :(得分:1)
knex.transaction((trx) => {
return knex('tab1')
.update({ col2: 'val2' })
.where({ col1: 'val1' })
.transacting(trx)
.then((result) => {
let promise;
if (result1 != 0) {
promise = util.insert(data1);
} else {
promise = util.mark(data2);
}
return promise
.transacting(trx);
})
.then(trx.commit)
.catch(trx.rollback)
})
.then(() => {
// blabla
})
.catch((err) => {
// handle your error together
});
如果util.insert
或util.mark
采取io操作,他们最好接受trx
作为参数。