Как добавить транзакции sequlize.js в асинхронную функцию

Пока я не добавлял транзакции в свой проект. Теперь я считаю, что могу подняться до этого уровня.

Если мне нужно обновить основную таблицу, таблицу подробностей и таблицу журналов, я бы сделал что-то вроде этого.

export async function create(req,res,next){
    try{

    const add_to_master_table = await db.Inovice_master.create();

    const add_to_detail_table = await db.Invoice_detail.create();

    const add_to_user_logs = await db.User_logs.create();

    res.sendStatus(200);

    }catch(error){
        res.sendStatus(500);
    }
}

В документации sequlize транзакция выглядит примерно так

return sequelize.transaction(function (t) {

  // chain all your queries here. make sure you return them.
  return User.create({
    firstName: 'Abraham',
    lastName: 'Lincoln'
  }, {transaction: t}).then(function (user) {
    return user.setShooter({
      firstName: 'John',
      lastName: 'Boothe'
    }, {transaction: t});
  });

}).then(function (result) {
  // Transaction has been committed
  // result is whatever the result of the promise chain returned to the transaction callback
}).catch(function (err) {
  // Transaction has been rolled back
  // err is whatever rejected the promise chain returned to the transaction callback
});

Итак, мой вопрос в том, как мне встроить транзакции в свой код, не выходя из режима async / await.

Любая помощь!

0
0
831
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете записать это таким образом.

return sequelize.transaction(async (t) =>  {

  let user = await User.create({firstName: 'Abraham', lastName: 'Lincoln'}, { transaction: t })
  user = await user.setShooter({ firstName: 'John', lastName: 'Boothe'}, { transaction: t });
  return user
})

Я предпочитаю пользовательский механизм CLS для передачи транзакций, вам также не нужно передавать транзакции для каждого запроса.

Автоматически передавать транзакции по всем запросам

Небольшое предупреждение: механизм CLS не работает для транзакций async / await в Sequelize 3. Я надеюсь, что он исправлен в Sequelize 5, но я еще не пробовал его.

Ryan Shillington 13.05.2019 23:52

Другие вопросы по теме