For AI agents: the complete documentation index is at llms.txt. Markdown versions of any page are available by appending .md to the URL path.

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

技术Egg.js

Egg.js 框架中使用事务

前言

在查了几遍 Sequelize 关于 Transactions 的文档,看了大佬同事的代码后,我终于弄懂怎么在 egg.js 框架里面使用事务了 😓

实践

Sequelize 关于事务的示例代码是这样滴,首先通过 sequelize.transaction 方法创建了一个事务后,把这个事务传给需要进行操作的函数,如新增用户,给用户加属性等,但是看上去代码比较难懂

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 中执行所要进行的操作,如果操作抛出了异常,那么就会回滚

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