如何在 Egg.js 中使用 Sequelize 的事务 Transaction
最后更新:
阅读时间: 1
min
前言
在查了几遍 Sequelize 关于 Transactions 的文档,看了大佬同事的代码后,我终于弄懂怎么在 egg.js 框架里面使用事务了 😓
实践
Sequelize 关于事务的示例代码是这样滴,首先通过 sequelize.transaction
方法创建了一个事务后,把这个事务传给需要进行操作的函数,如新增用户,给用户加属性等,但是看上去代码比较难懂
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| return sequelize.transaction().then(t => { return User.create( { firstName: 'Bart', lastName: 'Simpson' }, { transaction: t } ) .then(user => { return user.addSibling( { firstName: 'Lisa', lastName: 'Simpson' }, { transaction: t } ) }) .then(() => { return t.commit() }) .catch(err => { return t.rollback() }) })
|
实际使用的话需要用 async/await
语法让代码看起来更加清晰一点,在 egg.js 中使用的示例如下,首先需要用当前上下文中的 model 对象(就是对数据表的映射对象)创建一个事务,然后在 try/catch
中执行所要进行的操作,如果操作抛出了异常,那么就会回滚
1 2 3 4 5 6 7 8 9 10 11 12
| const transaction = await this.ctx.model.transaction()
try { await this.ctx.model.create(this.ctx.request.body, { transaction }) await this.ctx.service.user.find(userId, { transaction }); await this.ctx.service.product.destory(productId, { transaction }); ... await transaction.commit() } catch (err) { await transaction.rollback() throw err }
|
用了 async/await
语法,代码确实清晰了很多