Экземпляру секвелирования необходимо импортировать для использования транзакций.Он уже экспортирован в файл конфигурации базы данных с этой строкой db.sequelize = sequelize
.
Все, что вам нужно сделать, это добавить его в текущий импорт:
var exports = module.exports = {}
const Stock = require('../models').Stock; // Prefer const usage to avoid overwritting imports
const StockVariant = require('../models').StockVariant;
const sequelize = require('../models').sequelize;
Это также можно сделать водна строка с использованием деструктуризации:
const { Stock, StockVariant, sequelize } = require('../models');
Теперь давайте перейдем к транзакции.Как указано в документации , у вас есть два способа обработки: управляемый или неуправляемый.
Управляемая транзакция
Это делается путем объединенияасинхронные операции внутри обратного вызова транзакции сиквела.В этом случае, если операции, связанные с транзакцией, завершатся успешно, транзакция будет зафиксирована автоматически, в противном случае произойдет откат.
exports.create = function (req, res) {
const body = req.body;
console.log(body);
sequelize.transaction(function(t) {
return Stock.create(body, {transaction: t}) // We pass the transaction as a parameter here !
.then(function(stock, created) {
return StockVariant.create(..., {transaction: t}) // The transaction, again here
})
.catch(function(err) {
// Handle your error...
});
}
Неуправляемая транзакция
Если вы хотитеДля большей прозрачности и / или контроля над вашей транзакцией вы можете использовать неуправляемую транзакцию.В этом случае вы должны вызвать commit
и rollback
вручную.
exports.create = function (req, res) {
const body = req.body;
console.log(body);
sequelize.transaction
.then(function(t) { // Note the 'then' usage here
return Stock.create(body, {transaction: t}); // We pass the transaction as a parameter here !
.then(function(stock, created) {
return StockVariant.create(..., {transaction: t}); // The transaction, again here
});
.then(function() {
return t.commit();
})
.catch(function(err) {
return t.rollback();
});
}
Это также можно сделать с помощью синтаксиса async / await
, который может быть более приятным для чтения:
exports.create = function (req, res) {
const body = req.body;
console.log(body);
let t; // The variable in which the transaction object will be stored
try {
t = await sequelize.transaction();
const stock = await Stock.create(body, {transaction: t})
await StockVariant.create(..., {transaction: t}) // Whatever parameter you need to pass here
await t.commit();
} catch (err) {
await t.rollback();
}
}