Я использую knex в loopback для работы DB с mysql. Моя задача - обновить таблицу 2, используя транзакцию. Когда я ввожу новую запись в одну вкладку, я хочу использовать идентификатор этой записи для операции 2-го запроса.
Но когда транзакция бросает ошибку, она не откатывает данные/удаляет первую запись таблицы, если вторая запись таблицы вызывает ошибку. но в моем случае транзакция всегда не совершает отката, я помещаю свой примерный код ниже:
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);
});
});
}
пожалуйста, предоставьте мне подходящее предложение. благодарю вас
Вы можете не называть t.commit
или t.rollback
себя. См. Документы.
Сделайте свой код внутри транзакционной функции чем-то вроде этого
return t.insert({}).into('foo').returning('id').then( function(idArray) { return t.insert({fooId: idArray[0]}).into('bar') })
Это позволяет knex обрабатывать совершение и откат себя на основе результата результата этого обещания. Также обратите внимание, как я получил вставленный fooId
и применил его к объекту bar
для insert
иона. Это было упомянуто в вопросе.