我在环回中使用knex来使用mysql进行数据库操作。 我的任务是使用事务更新2表。 当我在一个tabe中输入新条目时,我想使用该条目的id进行第二次查询操作。
但是当事务抛出错误时,如果第二个表项引发错误,则不会回滚数据/删除第一个表项。但在我的情况下,事务总是提交不回滚我把我的示例代码放在下面:
addTest : (data) => {
return new promise(function(resolve, reject) {
knex.transaction(function(t) {
return knex('foo')
.transacting(t)
.insert({
foo_id: data.foo_id ? data.foo_id : null,
foo_name: data.foo_name ? data.foo_name : null,
date_entered : new Date()
})
.then(function() {
return knex('bar')
.transacting(t)
.insert({
bar_id: data.bar_id ? data.bar_id : null,
bar_name : data.bar_name ? data.bar_name : null
})
})
.then(t.commit)
.catch(function(e) {
t.rollback();
throw e;
})
})
.then(function() {
// it worked
// resolve('sucess');
console.log('success');
})
.catch(function(e) {
// it failed
console.log('error'+e);
});
});
}
请给我合适的建议。
谢谢
答案 0 :(得分:0)
您可以避免自己致电t.commit
或t.rollback
。见the docs。
在交易功能中使你的代码像这样
return t.insert({}).into('foo').returning('id')
.then( function(idArray) {
return t.insert({fooId: idArray[0]}).into('bar')
})
这使得knex可以根据该promise的结果处理提交和回滚本身。另外,请注意我如何插入fooId
并将其应用于bar
对象的insert
对象。在问题中提到了这一点。