美文网首页
TB数据库

TB数据库

作者: RadishHuang | 来源:发表于2021-04-26 14:31 被阅读0次

    数据库选型

    淘宝分了两种数据库,一种是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的来算。对比了下服务器输出的时间和当前的北京时间。

    时间

    相关文章

      网友评论

          本文标题:TB数据库

          本文链接:https://www.haomeiwen.com/subject/alhjrltx.html