7-1 介绍一下你们项目中的优惠券功能
在我们的项目中优惠券的功能大体上可以分为,新建优惠券、发放优惠券、领取优惠券、使用优惠券
1、新建优惠券:主要就是对优惠券数据表进行一个新增的操作
2、发放优惠券:有立即发放:优惠券立刻生效,直接出现在用户端页面供用户领取
定时发放:定一个发放开始时间,时间到期后才会进入出现在用户端页面
3、领取优惠券:手动领取:就是展示在用户端页面,由用户自己手动点击领取
指定发放:就是兑换码模式,后台给优惠券生成N张兑换码,由管理员发放给指定用户
4、使用优惠券:根据优惠券指定的课程,在下单时可以抵扣金额。
7-2 你们项目中是如何防止优惠券超领的
在我们的项目中优惠券超领分为,多人超买、单人超领
多人超买:出现的原因主要是:多线程并行运行、多行代码操作共享资源,但不具备原子性
要解决这种并发问题,方案基本就是加锁,锁一般可以分为:悲观锁、乐观锁
在我们的项目中采用的是乐观锁来解决的,在每次提交前都判断一下已领优惠券数量是否大于总优惠券数量,大于才会对表中已领优惠券数量进行修改。
单人超领:出现的原因主要是:并发场景下,实时查询的判断逻辑会存在失效问题
对于读的操作,我们一般都是采用悲观锁,常见的有Synchronized、Lock
在我们的项目中使用Synchronized实现,其中锁使用用户id
7-3 事务失效的场景有哪些
事务失效场景主要有这么几种:
1、事务方法非public修饰
2、非事务方法调用事务方法
3、事务方法的异常被捕获
4、事务异常类型不对
5、事务传播行为不对