我需要对数据库运行多个操作,并且需要将它们全部放入一个事务中。 这是我做事的方式,从我的测试来看,它似乎不正确。
基本上,对于每个操作,我都有一个返回 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
}
}
//当我在 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
,但我认为您需要返回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)
});
}
由于您没有返回 knex.transaction()
,此操作将从调用者的序列中“断开”,以异步方式运行。
您的return Promise.resolve()//this might be false
没问题。您将在 else
中返回已解决的 Promise,就像在函数的 if
部分中一样。因为该(子)函数仅在 Promise
... .then
内调用,所以您实际上可以省略 else
子句,因为 .then
语句自动将同步函数返回值转换为已解决的 Promise。
关于knex.js - 在一个事务中,一个接一个地执行多个操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49131120/