IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

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

    冷石发表于 2022-08-29 09:01:22
    love 0

    Egg.js 框架中使用事务

    前言

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



沪ICP备19023445号-2号
友情链接