TB数据库

2021-04-26  本文已影响0人  RadishHuang

数据库选型

淘宝分了两种数据库,一种是MongoDB,一种是MySQL。如果没有比较复杂的数据,并发等处理,可以考虑使用MongoDB。如这次项目需要涉及到抽奖,需要使用到事务逻辑,因此选型就选择了MySQL。在文档中,这类型的叫做RDS数据库。

RDS数据库文档

MySQL

值得注意的一点是,在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的来算。对比了下服务器输出的时间和当前的北京时间。

时间
上一篇下一篇

猜你喜欢

热点阅读