cover

如何在 Egg.js 中使用 Sequelize 的事务 Transaction

前言

在查了几遍 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 语法,代码确实清晰了很多

Buy Me A Coffee
← 数据结构与算法之链表 数据结构与算法之队列 →