23.uniCloud使用事务的备忘录

一、适用场景:对数据库中多个表进行增删改操作时,为了保证数据的一致性,例如:马云转账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,字符串类型。
需要的话自取,有问题私信。
点赞收藏加关注,你也能住大别墅!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值