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.