gpt4 book ai didi

database - Knex promise 交易

转载 作者:IT老高 更新时间:2023-10-28 23:07:02 25 4
gpt4 key购买 nike

我得到了正确的输出,实际上,这两个操作被视为一个事务单元;如果一个失败,两个都失败。

在这个代码示例中:我正在做一个交易

(1) 插入(2) 更新

我的方法是将我的数据库操作嵌套在 .then 中。我的问题是这段代码是否偶然正确?我对 promises 和 knex 不熟悉。

knex.transaction(function(t) {
knex('foo')
.transacting(t)
.insert({id:"asdfk", username:"barry", email:"barry@bar.com"})
.then(function() {
knex('foo')
.where('username','=','bob')
.update({email:"bob@foo.com"})
.then(t.commit, t.rollback)
})
})
.then(function() {
// it worked
},
function() {
// it failed
});

这行得通,但我觉得我仍然做错了什么。征求意见。

最佳答案

您需要从内部查询返回一个 promise ,以便外部链与它链接。

您还会吞下任何错误,因为您不会重新抛出它们 - 出于这个原因,最好使用 .catch() ,因为它可以更清楚地了解正在发生的事情 - 这就是会发生的事情普通的 try-catch 语句。

knex.transaction(function(t) {
return knex('foo')
.transacting(t)
.insert({id:"asdfk", username:"barry", email:"barry@bar.com"})
.then(function() {
return knex('foo')
.where('username','=','bob')
.update({email:"bob@foo.com"});
})
.then(t.commit)
.catch(function(e) {
t.rollback();
throw e;
})
})
.then(function() {
// it worked
})
.catch(function(e) {
// it failed
});

为了更好地理解它,这里是“模拟”的同步版本:

try {
var t = knex.transaction();
try {
knex("foo")
.transacting(t)
.insert({id:"asdfk", username:"barry", email:"barry@bar.com"});
knex("foo")
.where('username','=','bob')
.update({email:"bob@foo.com"});
t.commit();
}
catch (e) {
t.rollback();
// As you can see, if you don't rethrow here
// the outer catch is never triggered
throw e;
}
// It worked
}
catch (e) {
//It failed
}

关于database - Knex promise 交易,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22957032/

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