7-1 介绍一下你们项目中的优惠券功能
在我们的项目中优惠券的功能大体上可以分为,新建优惠券、发放优惠券、领取优惠券、使用优惠券。
1、新建优惠券:主要就是对优惠券数据表进行一个新增的操作。
2、发放优惠券:有立即发放:优惠券立刻生效,直接出现在用户端页面供用户领取。
定时发放:定一个发放开始时间,时间到期后才会进入出现在用户端页面。
3、领取优惠券:手动领取:就是展示在用户端页面,由用户自己手动点击领取。
指定发放:就是兑换码模式,后台给优惠券生成N张兑换码,由管理员发放给指定用户。
4、使用优惠券:根据优惠券指定的课程,在下单时可以抵扣金额。
7-2 你们项目中是如何防止优惠券超领的
在我们的项目中优惠券超领分为,多人超买、单人超领
多人超领时,可以使用乐观锁解决,每次提交前只要判断当前数量是否小于总计数量即可。
单人超领时,可以使用悲观锁解决,可以通过在领取优惠券代码块上加锁,锁用户id来解决此问题。
7-3 事务失效的场景有哪些
事务方法不是public修饰。 Spring中声明式事务是基于AOP结合动态代理实现的,spring要求被代理方法必须是public的。
非事务方法调用事务方法:非事务方法调用事务方法导致事务失效的原因与Spring框架的事务管理机制有关。Spring通过代理对象实现事务管理,但是非事务方法不会触发代理对象的创建,导致事务失效。
事务方法的异常被捕获:非事务方法调用事务方法时,由于异常被捕获而不会向外抛出,导致Spring无法感知事务异常,从而无法回滚事务,导致事务失效。
事务异常类型不对:Spring事务管理默认只感知RuntimeException异常,对于其他异常如IOException,Spring无法捕获并回滚事务,导致事务失效。
事务传播行为不对:事务传播行为定义了事务方法与其他事务方法的关系,包括如何处理事务的传播和边界。如果事务传播行为设置不正确,可能会导致事务失效或产生意外的结果。