gpt4 book ai didi

javascript - knex.transactions 中的 knex.raw 和 trx.commit

转载 作者:行者123 更新时间:2023-12-03 00:19:29 28 4
gpt4 key购买 nike

我刚刚接触 knex,遇到了事务。我认为它很有用,因为它具有回滚功能。尝试使用它(参见下面的代码)

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?我没有看到使用原始查询的交易示例。顺便说一句,我已连接到本地主机(postgresql)中的数据库。

最佳答案

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

调用 .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)
]);
})

关于javascript - knex.transactions 中的 knex.raw 和 trx.commit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54380656/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com