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?

18
demandé sur Mouneer 2017-03-18 07:12:30

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();
}
52
répondu user7403683 2018-01-17 14:17:05

le code ci-dessus a une erreur dans destroy call.

 await Model.destroy({where: {id}, transaction});

Le mouvement fait partie de l'objet options.

3
répondu Suhail Ansari 2017-11-15 08:07:07

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.

2
répondu rlib 2018-02-08 00:17:02

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é.

2
répondu kosinix 2018-04-04 05:47:30