Javascript knex.transactions中的knex.raw和trx.commit

Javascript knex.transactions中的knex.raw和trx.commit,javascript,knex.js,Javascript,Knex.js,我刚刚接触knex,遇到了一些交易。我认为它很有用,因为它有一个回滚功能。已尝试使用它(请参阅下面的代码) 我只是想删除一个带有特定id的行。 工作正常,然后我尝试删除“trx.commit”。我原以为它不会应用该查询,但它确实应用了。据我所知,如果不调用trx.commit,查询将不会运行,也不会影响数据库 我的理解错了吗?我是否在knex.transactions中不正确地使用了knex.raw?我没有看到使用原始查询的事务示例。顺便说一句,我已连接到本地主机(postgresql)中的数据

我刚刚接触knex,遇到了一些交易。我认为它很有用,因为它有一个回滚功能。已尝试使用它(请参阅下面的代码)

我只是想删除一个带有特定id的行。 工作正常,然后我尝试删除“trx.commit”。我原以为它不会应用该查询,但它确实应用了。据我所知,如果不调用trx.commit,查询将不会运行,也不会影响数据库


我的理解错了吗?我是否在knex.transactions中不正确地使用了knex.raw?我没有看到使用原始查询的事务示例。顺便说一句,我已连接到本地主机(postgresql)中的数据库。

knex.js有一个修改过的promise接口

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

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

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

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

knex.js有一个修改过的promise接口

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

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

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

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

我还注意到,有时当您忘记返回承诺或调用
.commit
时,它会正确提交。尽管如此,knex.js对于未定义的行为和在不同版本之间破坏它是不好的。不要强调它所做的没有文档记录的事情——坚持使用有意义且与文档匹配的模式。还要注意他们的非永久性更改。我还注意到,有时当您忘记返回承诺或调用
.commit
时,它会正确提交。尽管如此,knex.js对于未定义的行为和在不同版本之间破坏它是不好的。不要强调它所做的没有文档记录的事情——坚持使用有意义且与文档匹配的模式。还要注意他们的非永久性更改。