Egg.js中使用sequelize事务,egg-sequelize的事务transaction怎么使用

1,393 阅读2分钟

新的知识,分享一下

1应用实例

假如,你需要审核了一个很重要的订单列表,这时候肯定是要记录这个审核的人是谁,他操作了什么(操作记录列表),所以编辑功能成功后,必须要编辑记录能够查看到,这就是第一个接口(编辑:审核订单),和第二个接口(列表:编辑记录表)要正常返回才行,如果第一个成功,第二个失败,那必须要回滚到第一个操作之前(就是这个审核操作都不算),要么操作全部成功,要么全部失败回滚

当然还有更加复杂的例子: 推荐: www.cnblogs.com/zzsdream/ar…

2egg-sequelize的事务transaction怎么使用

事务具有原子性:表示最小的单位的意思。也就是某个操作要么成功,要么失败,不能成功一半,失败一半的

Sequelize有两种使用事务的方式:

api链接:
itbilu.com/nodejs/npm/…

1.基于Promise结果链的自动提交/回滚
2.另一种是不自动提交和回滚,而由用户控制事务
第一种是自动提交/回滚
第二种是手动commit,手动回滚

我们用的是手动的方式,自己提交以及回滚

return sequelize.transaction().then(function (t) {
  return User.create({
    firstName: 'Homer',
    lastName: 'Simpson'
  }, {transaction: t}).then(function (user) {
    return user.addSibling({
      firstName: 'Lisa',
      lastName: 'Simpson'
    }, {transaction: t});
  }).then(function () {
    return t.commit();
  }).catch(function (err) {
    return t.rollback();
  });
});

改成es6写法+实例

    const transaction = await this.ctx.model.transaction()
    try {
      // 这里主要是一个修改操作与一个记录的,报错就回滚
      const res = await service.activityManage.invitationNewPerson.setConfig({ 一堆参数(key:value) }, transaction)
      await service.common.systemCommonApi.insertHistoryOperateLog({ type: 12, content }, transaction)
      await transaction.commit()
      this.success({ data: res })
    } catch (error) {
      await transaction.rollback()
      ctx.onerror(error)
    }

3.遇到的问题

不受管理的事务需要你强制提交或回滚,如果不进行这些操作,事务会一直保持挂起状态直到超时。

刚开始也是遇到一个问题,用了transation,但是每次操作几次数据,重复点个5次左右就超时了,主要是问题还是自己不太会用,只传了transation并没有提交 这里因为不用也没关系,所以后面我就删调了~