Node.js 7 how to use sequelize transaction with async / await?

匿名 (未验证) 提交于 2019-12-03 01:14:02

问题:

Node.js 7 already support async / await syntax, in the sequelize transaction if the use of async / await will cause the transaction is not enabled, how should I use?

回答1:

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


回答2:

The above code has an error in destroy call.

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

Transaction is part of the options object.



回答3:

The accepted answer is an "unmanaged transaction", which requires you to call commit and rollback explicitly. For anyone who wants a "managed transaction", this is what it would look like:

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); } 

To rollback, just throw an error inside the transaction function:

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); } 

If any code that throws an error inside the transaction block, the rollback is automatically triggered.



回答4:

The answer given by user7403683 describes async/await way for unmanaged transaction (http://docs.sequelizejs.com/manual/tutorial/transactions.html#unmanaged-transaction-then-callback-)

Managed transaction in async/await style may look as follows:

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

If error occurs, the transaction is automatically rolled back.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!