一、适用场景:对数据库中多个表进行增删改操作时,为了保证数据的一致性,例如:马云转账1个亿给我这件事,意味着马云的帐号需要减少1个亿,我的帐号需要增加1个亿,如果二者有一个出问题,那么就需要将已经发生的操作进行撤回(通常叫回滚rollback),事务就是用来做这个的。
二、uniCloud提供了两种事务方法,我习惯用startTransaction。其特点在于,需要手动提交事务才会提交,我喜欢把操控权掌握在自己手中。
三、案例说明:用户创建宿舍后(room集合),在(user集合)自身的数据中ishave字段需要+1。如果异常,那么回滚并返回前端。服务端代码如下:
const db = uniCloud.database();
const dbCmd = db.command;
const transaction = await db.startTransaction() //开启事务
try {
//增加宿舍
const resaaa = await transaction.collection("room").add({
school: event.school,
roomNum: event.roomNum,
roomtype: event.roomtype,
members: event.members,
floor: event.floor,
uid: event.uid,
createtime: event.createtime
});
//user中 ishave +1
const resbbb = await transaction.collection("user").doc(event.uid).update({
ishave: dbCmd.inc(1)
});
if (resaaa.id && resbbb.updated) {
await transaction.commit();
return {
success: true
}
}
} catch (e) {
console.log(e);
await transaction.rollback(-100)
return {
success: false,
error: `rollback`,
rollbackCode: -100,
}
}
四、经过入坑和爬坑,我发现事务中的doc(),参数只能是数据集中的_id,字符串类型。
需要的话自取,有问题私信。
点赞收藏加关注,你也能住大别墅!