TB数据库
2021-04-26 本文已影响0人
RadishHuang
数据库选型
MySQL淘宝分了两种数据库,一种是MongoDB,一种是MySQL。如果没有比较复杂的数据,并发等处理,可以考虑使用MongoDB。如这次项目需要涉及到抽奖,需要使用到事务逻辑,因此选型就选择了MySQL。在文档中,这类型的叫做RDS数据库。
无符号值得注意的一点是,在MySQL中,可以使用无符号,这个意思就是该字段不允许负数的存在。如图在创建奖池剩余值的时候,会设置成无符号。保证这个字段的量不会超出。
事务处理
做抽奖,要考虑的并发的问题。通常有两种处理方式,一种是队列,一种是事务。这边侧重点讲事务的处理。在更新数据库的时候,只要有一步出错,会回滚事务里的所有操作。这边做的比较简单,主要是控制剩余量的非负数。如果剩余量出现了负数,回滚更新的操作,并把该次的中奖视为是无奖品,谢谢参与。
// 扣除奖池剩余量
const reduceLotteryRemainde = async (ctx, id) => {
const conn = await ctx.cloud.dataspace.beginTransaction();
try {
// 扣除该奖品的剩余量
const remaindeText = `update ${lotteryList} set remainderNum = remainderNum - 1 where productId = ?`;
const remaindeResult = await conn.executeSql(remaindeText, [id]);
if (!remaindeResult || !remaindeResult.affectedRows) {
throw new Error('更新奖品剩余量失败');
}
//事务提交
await conn.commit();
return true;
} catch (error) {
await conn.rollback();
return false;
}
}
RDS数据库的执行语句
通过sql语句来做业务逻辑就会方便很多,比如查找总数。
// 查找用户中某个奖品数量
const lotteryCount = async (ctx, id) => {
const { dataspace } = ctx.cloud;
const { openId } = ctx;
const sqltext = `select count(*) from ${userLottery} as count where productId = ? and openId = ?`;
const result = await dataspace.executeSql(sqltext, [id, openId]);
return (result && result.length && result[0].count) ? result[0].count : 0;
}
比如计算某一列的总和
const { dataspace } = ctx.cloud;
const { openId } = ctx;
// sum用户的countNum
const sqlText = `select sum(countNum) as countNum from ${numList} where openId = ?`;
const result = await dataspace.executeSql(sqlText, [openId]);
const count = (result && result.length) ? parseInt(result[0].countNum) : 0,
当插入或者更新的时候,返回类型
{
affectedRows: 2
fieldCount: 0
info: ""
insertId: 0
serverStatus: 2
warningStatus: 0
}
时间系统时间需要注意,默认都是UAT时间。服务器的时间按照UAT的来算。对比了下服务器输出的时间和当前的北京时间。