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)
       })
    }
  }
}

运行 通过这种方式,我注意到有时我会在一次更新和一次插入之间陷入僵局,这让我相信我的操作不会一个接一个地发生,但也许是并行发生的? 我该如何处理:

与@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 将价值转化为已解决的承诺。