7-1 介绍一下你们项目中的优惠券功能
在我的项目中,关于优惠券功能主要有以下几个步骤:
(一)优惠券生成:在后台系统中,管理端可以创建各种类型的优惠券,例如满减券、折扣券、无门槛券等。管理员可以设置优惠券的面额、有效期、使用条件等。
(二)发放优惠券:管理端可以通过多种方式发放优惠券,包括手动领取和指定发放。如果是手动发放,只用考虑发放时间和有效期限;如果是指定发放,是要用兑换码实现的,要考虑兑换码的生成;
(三)优惠券领取:用户可以直接领取或者兑换码来领取,如果是兑换码,要用bitmap位图判断兑换码是否已使用过;
以上就是我项目中优惠券的功能实现。
7-2 你们项目中是如何防止优惠券超领的
防止优惠券超领是确保优惠券系统正常运作的重要一环。在我的项目中,主要涉及两种情况会出现优惠券超卖问题,分别是多人并发下超卖和单人并发下超卖;以下是它们产生的原因和解决方案:
多人并发下超卖问题:是由于判断库存是否充足和判断后更新优惠券领取数量两个操作是独立的,不具备原子性;单线程下是不会触发的,但在多线程并发运行下,当线程1尚未更新时线程2就来查询,此时查到的库存数据是旧的,但是线程2又不知道就会认为库存充足,就会导致并发安全问题产生。
解决方案:在更新优惠券的sql语句上加上issue_num是否小于total_num即可。这样,只要issue_num小于total_num,不管有多少线程来执行,都会成功。
单人并发下超卖问题:是由于判断每个人是否超过领取限额和向数据库中保存用户优惠券信息两个操作是独立的,不具备原子性;单线程下是不会触发的,但在多线程并发运行下,当线程1尚未更新时线程2就来查询,此时查到的数量是旧的,但是线程2又不知道就会认为数量还没到领取限额,就会导致并发安全问题产生。
解决方案:这里用的是Synchronized的同步代码块,锁用户id做对象来解决的;
以上就是我项目中防止优惠券超领的解决方案。
7-3 事务失效的场景有哪些
事务失效是指在数据库管理系统中,事务未能按照预期的方式执行或提交,导致数据的不一致性或错误。以下是一些可能导致事务失效的场景:
(一)事务方法非public修饰:
由于Spring的事务是基于AOP的方式结合动态代理来实现的。因此事务方法一定要是public的,这样才能便于被Spring做事务的代理和增强。
(二)非事务方法调用事务方法;
(三)事务方法的异常被捕获;
(四)事务异常类型不对;
Spring的事务管理默认感知的异常类型是RuntimeException,当我们的业务中会抛出RuntimeException以外的异常时,应该通过@Transactional注解中的rollbackFor属性来指定异常类型。[@Transactional(rollbackFor = Exception.class)]
(五)事务传播行为不对;
以上就是我了解的事务失效的场景。