node.js: создание транзакции, охватывающей вызовы в более чем одно хранилище
Я привык кодировать, используя C#, и иногда я создаю транзакции, которые имеют более одного обращения к разным репозиториям, и если одна из них вызывает сбой, откат покрывает каждый репозиторий.
Код выглядит так:
using (var scope = new TransactionScope())
{
itemRepository.deleteItems(items);
bookRepository.deleteBooks(books);
scope.Complete();
}
Это гарантирует, что если в bookRepository произойдет ошибка, удаленные элементы будут возвращены.
Теперь я пытаюсь сделать то же самое с помощью node.js. Я нашел пакет mssql, в котором есть возможность создавать транзакции, но только внутри репозитория, например:
var transaction = new sql.Transaction(/* [connection] */);
transaction.begin(function(err) {
// ... error checks
var request = new sql.Request(transaction);
request.query('insert into mytable (mycolumn) values (12345)', function(err, recordset) {
// ... error checks
transaction.commit(function(err, recordset) {
// ... error checks
console.log("Transaction committed.");
});
});
});
Итак, есть ли какой-нибудь способ создать транзакцию в Сервисе, которая охватывает более одного репозитория, как я описал?
1 ответ
Вы можете создать область транзакции, используя красивую среду под названием Sequelize. Если вы посмотрите страницу относительно транзакций, вы сможете найти способ передать транзакцию всем запросам.
sequelize.transaction(function (t1) {
// With CLS enabled, the user will be created inside the transaction
return User.create({ name: 'Alice' });
});