Node.js 7已經支持async/await語法,在sequelize事務中如果使用async/await會導致事務未啓用,應該如何使用?Node.js 7如何使用async/await進行sequelize事務?
8
A
回答
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();
}
3
上述代碼在銷燬調用中有錯誤。
await Model.destroy({where: {id}, transaction});
交易是選項對象的一部分。
+1
修正了上面的答案 - 謝謝 – pkyeck
1
通過user7403683給出的答案描述異步/ AWAIT方式對非託管交易(http://docs.sequelizejs.com/manual/tutorial/transactions.html#unmanaged-transaction-then-callback-)
管理的事務在異步/等待風格可能會是這樣:
await sequelize.transaction(async t=>{
const user = User.create({ name: "Alex", pwd: "2dwe3dcd" }, { transaction: t})
const group = Group.findOne({ name: "Admins", transaction: t})
// etc.
})
如果發生錯誤,交易自動回滾。
0
接受的答案是一個「非託管交易」,它要求您明確地呼叫commit
和rollback
。誰想要一個「管理交易」,這是它會是什麼樣子:
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);
}
要回滾,只是拋出一個錯誤的事務函數內:
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);
}
相關問題
- 1. Sequelize事務:ER_LOCK_WAIT_TIMEOUT
- 2. node.js + sequelize +查詢執行
- 3. node.js + sequelize +連續執行
- 4. sequelize更新事務鎖定行
- 5. 如何使用gm node.js進行組合?
- 6. 使用sequelize,mocha和async進行單元測試:Sequelize不回撥
- 7. node.js - Sequelize查詢表
- 8. 如何使用Sequelize和node.js批量插入
- 9. 如何使用node.js中的sequelize編寫mysql連接查詢?
- 10. AsyncAwait概念
- 11. 使用HibernateTemplate進行事務管理
- 12. 使用MySQL進行分片和事務
- 13. 使用事務回滾進行測試
- 14. 使用jdbctemplate進行spring事務管理
- 15. 如何使用sequelize ORM
- 16. 如何使用sequelize ORM
- 17. 使用MAMP進行Sequelize和MySQL,出現錯誤
- 18. 如何在使用tSQLt進行測試時回滾事務
- 19. 使用DatabaseCleaner和事務進行快速測試。如何調試?
- 20. 如何使用Hibernate Session.doWork(...)進行保存點/嵌套事務?
- 21. 如何在使用Devise進行更新之前添加事務?
- 22. 如何使用Spring/MyBatis進行事務處理?最佳實踐?
- 23. 如何使用記事本進行textview?
- 24. 使用JNDI和JPA事務管理器進行Spring事務
- 25. Node.js mysql事務
- 26. 廣東話安裝asyncawait使用NPM
- 27. 是否有可能使用node.js和noSQL db進行事務處理?
- 28. 如何使用Express/Node.JS使用EJS進行降價?
- 29. 使用sequelize說明事務時,如何實現某些語句不交易?
- 30. 如何使用Node.js和Tedious從單個連接/事務中進行多個數據庫調用
這是行不通的。在這種情況下't'是一個Promise而不是交易對象。 – Pier
@Pier,等待sequelize.transaction()然後得到它的結果。 t不是承諾,而是承諾的結果。 –
哦,你是對的,我完全錯過了 – Pier