评论

收藏

[JavaScript] thinkjs使用事务

开发技术 开发技术 发布于:2021-06-28 17:46 | 阅读数:569 | 评论:0

  首先需要警告下朋友们,千万别去thinkjs官网群里面去问那些大佬,个别大佬的脾气是真的惹不起系列。比如:
DSC0000.png
DSC0001.png

  行了,不扯没用的了,但是说实话真的是在官网群里面被气死了。【手动微笑】
  下文当中有任何疑问问题请在评论区评论,笔者会在第一时间回复。或者进入笔者技术交流群互动:react:815413387,vue:942347564,JAVA:830645840。
1.model中使用手工操作事务
async addData(data) {
  // 如果添加成功则 commit,失败则 rollback
  try {
  await this.startTrans();
  const result = await this.add(data);
  await this.commit();
  return result;
  } catch(e){
  await this.rollback();
  }
}
2.model中使用transaction
async updateData(data){
  const result = await this.transaction(async () => {
  const insertId = await this.add(data);
  // 通过 db 方法让 other_model 模型复用当前模型的数据库连接
  const otherModel = this.model('other_model').db(this.db());
  const addRes = await otherModel.add({user_id: insertId, cate_id: 100});
  return addRes;
  })
}
3.controller中使用手工操作事务
async xxxAction() {
const data = this.post();
// 一定要保证三个或N个在一次连接中进行
const salesRecord = this.ctx.model('sales_record');
const salesRecordItem = this.ctx.model('sales_record_item').db(salesRecord.db());
const members = this.ctx.model('members').db(salesRecord.db());
// 使用try catch捕捉错误
try {
  await salesRecord.startTrans(); // 开启事务
  const submitRecordRes = await salesRecord.submitSalesRecord(data);
  await salesRecordItem.addMany(data.items);
  await salesRecord.commit(); // 一切正常就提交
} catch (e) {
  await salesRecord.rollback(); // 出错了就rollback
}
}
4.controller中使用transaction
async xxxAction() {
const data = this.post();
// 一定要保证三个或N个在一次连接中进行
const salesRecord = this.ctx.model('sales_record');
const salesRecordItem = this.ctx.model('sales_record_item').db(salesRecord.db());
const members = this.ctx.model('members').db(salesRecord.db());
// 开始事务
await salesRecord.transaction(async() => {
  // 捕捉异常
    try {
    await members.updateMember(data);
    await salesRecord.submitSalesRecord(data);
    // 提交最后的结果,如果最后成功了那就会执行commit,失败了会rollback
    return await salesRecordItem.addMany(data.items);
    } catch (e) { // 出错了就rollback
    await salesRecord.rollback();
    }
  });
}
查看最后的结果
  这是成功了走的commit
DSC0002.png
这是失败了走的rollback
DSC0003.png
  有啥问题评论区交流吧~

  
关注下面的标签,发现更多相似文章