我需要针对数据库运行多个操作,我需要将它们全部放入事务中。 这是我做事的方式,从我的测试来看,这似乎不对。
基本上对于每个操作,我都有一个返回knex promise的函数。根据参数,可能不需要实际执行任何操作,例如,如果没有要插入的行,我不需要做任何事情
function insertRows(rowsToInsert, trx){
if (rowsToInsert && rowsToInsert.length>0){
return knex.batchInsert(...).transacting(trx)
}else{
//no need to run
return Promise.resolve() //this is probably wrong
}
}
//我在yield
co
此函数返回一个承诺
function process(params){
return new Promise(function (resolve, reject){
knex.transaction(function(trx){
return insertRows(rows, trx)
.then(function (result){
return insertRows(rows2,trx)
}).then(function (result){
return updateRows(rows3,trx)
})
}
}
}
以这种方式运行我注意到有时候我可以在一次更新和一次插入之间出现死锁,这样我就相信我的操作不会一个接一个地发生但可能并行发生? 我应该怎么处理:
then()
,因此只需跳到下一个then()
答案 0 :(得分:0)
与@Mikael达成协议,您不需要return knex.transaction(
,但我认为您需要function process(params){
return knex.transaction(function(trx){
return insertRows(rows, trx)
}).then(function (result){
return insertRows(rows2,trx)
}).then(function (result){
return updateRows(rows3,trx)
});
}
,以便在完成其他处理之前完成交易功能?
return knex.transaction()
由于你没有return Promise.resolve() //this is probably wrong
,这个操作将与调用者的序列“断开”,异步运行。
您的else
没问题。您将在if
中返回已解决的承诺,就像在函数的Promise
部分中一样。因为该(子)函数仅在.then
... else
内调用,所以实际上可以省略.then
子句,因为{{1}}语句会自动转换同步函数返回将价值观转化为已解决的承诺。