优惠券实现和事务失效

本文介绍了项目中优惠券功能的详细实现,包括发放、查询、领取和兑换过程。重点讨论了并发情况下如何防止超领(乐观锁和同步代码块),以及事务失效的常见场景和解决方案,尤其关注Spring事务管理中的异常处理机制。
摘要由CSDN通过智能技术生成

7-1 介绍一下你们项目中的优惠券功能
我们项目中优惠券在完成基本优惠券的增删改查之后,额外附加四大功能。分别是发放优惠券、查询优惠券、领取优惠券和兑换优惠券。
发放优惠券的发放方式有立刻发放、定时发放,使用期限有固定天数和固定时间段。因为优惠券的基本信息已经有了,发放优惠券只需要更新一部分数据即可。在发放优惠券的时候,如果发现优惠券的领取方式是指定发放,则需要生成兑换码。由于生成兑换码的数量较多,可能比较耗时,这里推荐基于线程池异步生成。
用户在学习平台主界面可以直接点击图标领取优惠券,此处需要根据用户-优惠券表协助判断优惠券是否可以领取,是否可以使用。
用户领取优惠券的页面看起来简单,其最终目的就是往user_coupon表插入一条数据,记录用户和优惠券之间的关系、使用状态等
但是这个接口复杂在:需要做充分的逻辑校验:校验优惠券是否存在、校验当前领取时间是否在优惠券的发放时间范围内,校验优惠券的库存是否充足、校验优惠券每人限领数量
兑换码兑换优惠券与直接领取优惠券都是领券动作,因此整体流程也基本一致,只是需要增加一下兑换码有效性的校验,还要一定程度上避免重复兑换。

7-2 你们项目中是如何防止优惠券超领的
优惠券超领有多人和单人两种情况。
对于多人这种并发问题,方案基本就是加锁,在项目中我们使用乐观锁来解决上面代码的问题。每次提交SQL语句只要判断售卖数量是否小于总数量即可,因为SQL语句具有原子性。
对于单人超卖,我们项目中使用的是同步代码块的方式,锁用户id,但是得注意写成synchronized(userId.toString().intern()),因为intern能保证得到的结果用 == 判断也是true,从而避免Long型数据判断比较对象地址的问题。

7-3 事务失效的场景有哪些
事务失效的场景有5种。
事务方法非public修饰
非事务方法调用事务方法
事务方法的异常被捕获
事务异常类型不对。Spring的事务管理默认感知的异常类型是RuntimeException,当事务方法内部抛出了一个IOException时,不会被Spring捕获,因此就不会触发事务回滚,事务就失效了。
事务传播行为不对

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值