knex.raw和trx.commit在knex.transactions中

时间:2019-01-26 17:07:18

标签: javascript knex.js

我对knex还是陌生的,并且遇到了Transaction。我认为使用它很有用,因为它具有回滚功能。尝试使用它(请参见下面的代码)

await knex.transaction(trx => {
knex.raw(delete from myTable where "id" = 1 )
  .transacting(trx) 
  .then(trx.commit)
  .catch(trx.rollback) 
})

我只是想越来越多地删除具有特定ID的行。 工作正常,然后我尝试删除“ trx.commit”。我期望它不会应用查询,但确实可以。据我了解,如果不调用trx.commit,查询将不会运行,也不会影响数据库。

我的理解错误吗?我是否在knex.transactions中使用了不正确的knex.raw?我没有看到使用原始查询的交易示例。我已连接到我的localhost(postgresql)btw中的数据库。

1 个答案:

答案 0 :(得分:0)

knex.js具有修改后的Promise接口。

调用.then会触发查询实际触发(如果是第一个查询,则包括BEGIN事务)。请注意,在单个knex查询中,您无需调用回滚,因为对数据库的单个查询应该是事务性的,如果遇到任何错误,则中止/回滚。

根据您的使用情况(和文档),如果您删除trx.commit,则根本不应该提交。我建议实际上将一个Promise返回到事务回调中-然后它将在Promise解析时自动提交,并在Promise失败时自动回滚。

在以下用法中,如果任一查询失败,它将自动回滚所有内容。

knex.transaction(trx => {
  return Promise.all([
     knex.raw(`update table x`).transacting(trx),
     knex.raw(`update table y`).transacting(trx)
    ]);
})