新的知识,分享一下
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并没有提交
这里因为不用也没关系,所以后面我就删调了~