day07-小结

本文介绍了项目中的优惠券功能,包括管理端的创建、发放和用户端的查询、领取,以及如何通过事务机制防止优惠券超领,特别关注了Spring框架下的事务失效场景及其解决方案。
摘要由CSDN通过智能技术生成

7-1 介绍一下你们项目中的优惠券功能

        我们项目中的优惠券涉及到了管理端和用户端

        首先,管理端可以创建优惠券,它可以设置优惠券的类型、使用范围、推广方式等;它还可以发放优惠券,设置优惠券的发放方式、有效期等信息。

        其次,用户端可以查询,领取和使用优惠券。优惠券有两种获取方式,第一种是手动领取,第二种是使用兑换码兑换。

        最后,获取到优惠券就可以在购买商品时用来获取更迂回的价格了。

这就是我们项目中的优惠券功能。

7-2 你们项目中是如何防止优惠券超领的

        优惠卷超领分为多人超领和单人超领。

        首先给优惠卷领取动作加上开启事务注解,解决多人超领问题是给更新数据这个操作加上乐观锁,解决单人超领给查询判断新增这个操作加锁,锁的粒度为用户id,这样操作会出现事务边界和事务失效问题;

        为解决事务边界,为此要把添加事务的方法抽取出来单独在这个方法开启事务,在优惠卷领取动作内调用这个方法 并为这个方法添加锁;

解决事务失效,要在启动类上添加注解来暴露代理对象,用代理对象调用事务方法。

7-3 事务失效的场景有哪些

        1.事务方法非public修饰
        由于 Spring的事务是基于AOP的方式结合动态代理来实现的。因此事务方法一定要是public的,这样才能便于被Spring做事务的代理和增强。

        2.非事务方法调用事务方法
        不是被Spring代理对象的代理方法导致事务失效。

        3.事务方法的异常被捕获
        方法内部直接捕获了Exception类型的异常,也就是说方法执行过程中即便出现了异常也不会向外抛出。而Spring的事务管理就是要感知业务方法的异常,当捕获到异常后才会回滚事务。 事务被捕获,就会导致Spring无法感知事务异常,自然不会回滚,事务就失效了。

        4.事务异常类型不对
        Spring的事务管理默认感知的异常类型是RuntimeException,当事务方法内部抛出了一个IOException时,不会被Spring捕获,因此就不会触发事务回滚,事务就失效了。

因此,当我们的业务中会抛出RuntimeException以外的异常时,应该通过@Transactional注解中的rollbackFor属性来指定异常类型。

        5.事务传播行为不对
错误的传播行为可能导致事务与外部事务相互独立,无法正确协调事务的提交和回滚,从而导致事物的实效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值