knex.js - 在一个事务中,一个接一个地执行多个操作

标签 knex.js

我需要对数据库运行多个操作,并且需要将它们全部放入一个事务中。 这是我做事的方式,从我的测试来看,它似乎不正确。

基本上,对于每个操作,我都有一个返回 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
  }
}

//当我在 coyield 这个函数时,我会返回一个 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/

相关文章:

postgresql - 简单的 knex 查询只返回表名

api - 在 API 上公开 Sequelize 过滤机制

mysql - 如何使用knexjs从mysql返回插入的数据?

mysql - 使用 Knex、Express 和 NodeJS 执行登录和注册

knex.js - 如何在 Knex 迁移中设置默认值?

node.js - 如何连接 KnexJS 和数据库 Oracle?

knex.js - 如何针对远程数据库运行 Knex 迁移?

node.js - 使用 knex 和 sqlite3 的 node.js 方法测试永远不会停止

javascript - 通过 Knex.js 执行 POSTGRES LIKE 时出现语法错误

mysql - Knex.js 使用别名计算不同的列