thinkjs使用事务
首先需要警告下朋友们,千万别去thinkjs官网群里面去问那些大佬,个别大佬的脾气是真的惹不起系列。比如:行了,不扯没用的了,但是说实话真的是在官网群里面被气死了。【手动微笑】
下文当中有任何疑问问题请在评论区评论,笔者会在第一时间回复。或者进入笔者技术交流群互动: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
这是失败了走的rollback
有啥问题评论区交流吧~
页:
[1]