天猫双十一有个积分换墨盒的活动,总共有50万台天猫魔盒(box),每个用户(user)可以用99个天猫积分(point)兑换一台魔盒,且每人限换一台。 请设计一套java接口并实现下单(order)逻辑。 参考(但不局限于)下面的下单逻辑:
1、创建订单
2、扣减用户积分
3、扣减魔盒库存
4、下单成功
同时请回答:
1、数据库表结构如何设计,有哪些表,分别有什么作用?
2、下单过程中哪些地方可能成为瓶颈?如何解决或改善?
3、是否会用到数据库事务,哪些地方会用到?如果不用数据库事务,如何保证数据的一致性?
1、表的设计:
①用户表usertable ,字段id,name,point,以及记录该用户是否曾经兑换过魔盒的标志字段hasdown,用0表示没有下过,1表示下过
②魔盒表boxtable,字段allnumber表示总数,remainnumber表示所省的魔盒数量
③订单表ordertable,字段id,userid,ordertime表示下单时间
2、并发过程,当所有用户同时访问数据库,操作魔盒表和用户表时为了保证事务的一致性,有必要在业务逻辑处理的地方,即更改魔盒表中魔盒数量的代码块或接口和对用户表信息的处理地方处都要加上同步机制,事务回滚等措施
3、用到的事务
判断用户信息:积分是否大于99,是否曾经兑换过魔盒(hasdown是否为0),如果积分够又没兑换过,那么在兑换时用户表里的积分数要减去99,并且置hasdown为1
操作魔盒表:判断魔盒剩余数是否大于0,如果大于0就进行兑换,并使魔盒数减1,
订单表:当以上两个事务均完成时再向订单表里插入一条记录,包括用户id,下单时间
数据库表结构如何设计,有哪些表,分别有什么作用?
答案:三个表,分别是:
用户信息表,有字段:id(用户编号),name(用户名),point(现有积分),box_num(拥有魔盒个数)
魔盒信息表,有字段:all_num(所有魔盒个数),remain_num(剩余魔盒个数)
订单表,有字段:id(订单编号),user_id(用户 id),order_time(下单时间)
下单过程中哪些地方可能成为瓶颈?如何解决或改善?
答案:所有的用户下单的时候需要对魔盒信息表进行写入,需要对其进行加锁,这是瓶颈。
改善方法:不知道,求大家支招。
答案:会用到数据库事务,用户下单的时候,需要对用户现有积分,拥有魔盒个数,剩余魔盒个数这些字段进行修改,另外,还要在订单表中添加一条新的记录,所有这些都包含在一个事务中。