Nœud.js 7 Comment utiliser sequelize transaction avec async / wait?
noeud.js 7 supporte déjà la syntaxe async / wait, dans la transaction sequelize si l'utilisation d'async / wait va provoquer que la transaction n'est pas activée, comment devrais-je l'utiliser?
4 réponses
let transaction;
try {
// get transaction
transaction = await sequelize.transaction();
// step 1
await Model.destroy({where: {id}, transaction});
// step 2
await Model.create({}, {transaction});
// commit
await transaction.commit();
} catch (err) {
// Rollback transaction if any errors were encountered
await transaction.rollback();
}
le code ci-dessus a une erreur dans destroy call.
await Model.destroy({where: {id}, transaction});
Le mouvement fait partie de l'objet options.
la réponse donnée par l'utilisateur 7403683 décrit async / en attente d'une transaction non gérée(http://docs.sequelizejs.com/manual/tutorial/transactions.html#unmanaged-transaction-then-callback-)
Réussi transaction dans async/await style peut regarder comme suit:
await sequelize.transaction( async t=>{
const user = User.create( { name: "Alex", pwd: "2dwe3dcd" }, { transaction: t} )
const group = Group.findOne( { name: "Admins", transaction: t} )
// etc.
})
si une erreur se produit, le mouvement est automatiquement reconduit.
la réponse acceptée est une "transaction non gérée", qui exige que vous appeliez commit
et rollback
explicitement. Pour quiconque souhaite une "transaction gérée", voici à quoi elle ressemblerait:
try {
// Result is whatever you returned inside the transaction
let result = await sequelize.transaction( async (t) => {
// step 1
await Model.destroy({where: {id: id}, transaction: t});
// step 2
return await Model.create({}, {transaction: t});
});
// In this case, an instance of Model
console.log(result);
} catch (err) {
// Rollback transaction if any errors were encountered
console.log(err);
}
Pour la restauration, il suffit de jeter une erreur à l'intérieur de l'opération de la fonction:
try {
// Result is whatever you returned inside the transaction
let result = await sequelize.transaction( async (t) => {
// step 1
await Model.destroy({where: {id:id}, transaction: t});
// Cause rollback
if( false ){
throw new Error('Rollback initiated');
}
// step 2
return await Model.create({}, {transaction: t});
});
// In this case, an instance of Model
console.log(result);
} catch (err) {
// Rollback transaction if any errors were encountered
console.log(err);
}
si un code envoie une erreur à l'intérieur du bloc de transaction, le retour en arrière est automatiquement déclenché.