2017-03-18 47 views

Odpowiedz

21
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(); 
} 
+0

To nie działa. 't' w tym przypadku jest Obietnicą, a nie obiektem transakcji. – Pier

+1

@Pier, poczekaj na sequelize.transaction(), a następnie uzyskaj wynik. t nie jest obietnicą, jest wynikiem obietnicy. –

+0

Oh masz rację, całkowicie przegapiłem to – Pier

3

Powyższy kod zawiera błąd w wywołaniu niszczenia.

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

Transakcja jest częścią obiektu opcji.

+1

poprawiono odpowiedź powyżej - dzięki – pkyeck

1

Odpowiedź udzielona przez user7403683 opisuje asynchronicznej/czekają na drogę niekontrolowana transakcji (http://docs.sequelizejs.com/manual/tutorial/transactions.html#unmanaged-transaction-then-callback-)

Zarządzane transakcji w async/czekają styl może wyglądać następująco:

await sequelize.transaction(async t=>{ 
    const user = User.create({ name: "Alex", pwd: "2dwe3dcd" }, { transaction: t}) 
    const group = Group.findOne({ name: "Admins", transaction: t}) 
    // etc. 
}) 

W przypadku wystąpienia błędu, transakcja jest automatycznie wycofane.

0

Przyjęta odpowiedź to "transakcja niezarządzana", która wymaga jawnego połączenia pod numerami commit i rollback. Dla każdego, kto chce „Udało transakcji”, to co to będzie wyglądać:

try { 
    // Result is whatever you returned inside the transaction 
    let result = await sequelize.transaction(async (transaction) => { 
     // step 1 
     await Model.destroy({where: {id}, transaction}); 

     // step 2 
     return await Model.create({}, {transaction}); 
    }); 

    // In this case, an instance of Model 
    console.log(result); 
} catch (err) { 
    // Rollback transaction if any errors were encountered 
    console.log(err); 
} 

Aby wycofać, po prostu wyrzucić błąd wewnątrz funkcji transakcyjnej:

try { 
    // Result is whatever you returned inside the transaction 
    let result = await sequelize.transaction(async (transaction) => { 
     // step 1 
     await Model.destroy({where: {id}, transaction}); 

     // Cause rollback 
     if(false){ 
      throw new Error('Rollback initiated'); 
     } 

     // step 2 
     return await Model.create({}, {transaction}); 
    }); 

    // In this case, an instance of Model 
    console.log(result); 
} catch (err) { 
    // Rollback transaction if any errors were encountered 
    console.log(err); 
}