如果发生其他情况,则回滚事务处理

问题描述

我在knex中使用事务处理此代码

knex.transaction(async trx => {

        try {
            const ids = await knex('team').insert({id: 6,name: "test1"}).transacting(trx);
            const idsNew = await knex('team').insert({id: 7,name: "test2"}).transacting(trx);

            if(condition){
                await trx.rollback();
            }
        } catch (err) {
            console.log(err)
        }
      })

当conditon == true时,我运行回滚事务,并且数据库没有新数据。 但是日志抛出错误(node:32723) UnhandledPromiseRejectionWarning: Error: Transaction rejected with non-error: undefined

有人帮助我解释此错误并帮助我解决此问题吗? 谢谢!

解决方法

当事务处理程序函数返回承诺时(异步函数总是这样做),这意味着knex在该承诺解决/拒绝时隐式提交/回滚。

那是上面代码的第一个问题。该错误消息带来的下一个问题是trx.rollback()需要一个参数。 trx.rollback(new Error("Condition caused rollback!"));

这是应该起作用的代码:

knex.transaction(异步trx => {

    try {
        const ids = await knex('team').insert({id: 6,name: "test1"}).transacting(trx);
        const idsNew = await knex('team').insert({id: 7,name: "test2"}).transacting(trx);

        if(condition){
            // this causes handler function to reject the returned promise
            // and knex will do implicit rollback
            throw new Error("Rolling back because of condition");
        }
    } catch (err) {
        console.log(err)
    }
  })