транзакция knex не работает в nodejs

0

Я использую 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);
    }); 
  });
}

пожалуйста, предоставьте мне подходящее предложение. благодарю вас

Теги:
loopbackjs
knex.js

1 ответ

0

Вы можете не называть 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 иона. Это было упомянуто в вопросе.

  • 0
    Ваша неопределенная привязка связана с тем, что столбец отсутствует в вашей базе данных; запрос не может быть вставлен. Все остальное трудно понять, не видя код, который вы используете для получения этой ошибки (и определения ваших таблиц БД)
  • 0
    Мой код объявлен выше
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню