knex 多个操作,一个接一个,在一个事务中
knex multiple operations, one one after another, inside a transaction
我需要对数据库进行 运行 多项操作,并且我需要将它们全部放入一个事务中。
这是我做事的方式,从我的测试来看,它似乎不正确。
基本上,对于每个操作,我都有一个 returns knex 承诺的功能。根据参数,实际上可能不需要做任何事情,例如,如果没有要插入的行,我不需要做任何事情
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
}
}
//我在 co
中 yield
这个函数时返回一个 promise
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()
与@Mikael 一致,您不需要 new Promise
,但我认为您还需要 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()
,这个操作将'disconnected'来自调用者的序列,运行异步。
你的 return Promise.resolve() //this is probably wrong
没问题。您正在 return 在 else
中执行已解决的承诺,就像在函数的 if
部分中一样。因为该(子)函数仅在 Promise
... .then
中调用,您实际上可以省略 else
子句,因为 .then
语句自动转换同步函数 return 将价值转化为已解决的承诺。
我需要对数据库进行 运行 多项操作,并且我需要将它们全部放入一个事务中。 这是我做事的方式,从我的测试来看,它似乎不正确。
基本上,对于每个操作,我都有一个 returns knex 承诺的功能。根据参数,实际上可能不需要做任何事情,例如,如果没有要插入的行,我不需要做任何事情
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
}
}
//我在 co
yield
这个函数时返回一个 promise
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()
与@Mikael 一致,您不需要 new Promise
,但我认为您还需要 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()
,这个操作将'disconnected'来自调用者的序列,运行异步。
你的 return Promise.resolve() //this is probably wrong
没问题。您正在 return 在 else
中执行已解决的承诺,就像在函数的 if
部分中一样。因为该(子)函数仅在 Promise
... .then
中调用,您实际上可以省略 else
子句,因为 .then
语句自动转换同步函数 return 将价值转化为已解决的承诺。