day07

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

         优惠券功能处于促销微服务中,主要包括创建优惠券---发放优惠券---手动领取、兑换优惠券这三个阶段,一下我以这三个阶段介绍一下优惠券功能。

        创建优惠券:在创建优惠券时可以选择一些有关于优惠券的基本信息,比如优惠券的名称、适用范围、类型、推广方式、发送数量与每人限领张数等。

        发送优惠券:在发送优惠券时可以选择发放方式和使用期限。

        手动领取、兑换优惠券:用户可以再优惠券页面直接领取或者输入对应的兑换码来领取相应的优惠券。

        以上就是项目中的优惠券大致功能,谢谢。


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

        项目中呢主要面临两种超领情况:多人超领问题单人超领问题,解决方案如下所示:

        多人超领问题:在我们的项目中,采用了乐观锁的CAS思想,在更新数据前先判断数据与我之前查询到的是否一致,不一致则证明有其它线程也在更新。 为了避免出现安全问题,放弃本次更新或者重新尝试一次。这种方案性能好、安全性也好,但是并发较高时,可能出现更新成功率较低的问题。在项目中,每次提交前只需要判断发行的数量是否小于总共的数量即可。

        单人超领问题:在我们的项目中,这里采用了悲观锁,同步代码块,锁住用户的id,由于我们的id为Long属性,因此需要使用userId.toString().intern()来解决这个问题,现在只要两个字符串equals的结果为true,那么intern就能保证得到的结果用 ==判断也是true。

        以上就是在项目中对于如何防止优惠券超领的解决方案,谢谢。


3. 事务失效的场景有哪些

        事务失效的场景主要有以下五种:

(1) 事务方法非public修饰

        由于Spring的事务是基于AOP的方式结合动态代理来实现的。因此事务方法一定要是public的,这样才能便于被Spring做事务的代理和增强。而且,在Spring内部也会有一个专门的类去检查事务方法的修饰符,所以,事务方法一定要被public修饰!我们当前是满足的。

(2) 非事务方法调用事务方法

        事务方法会交由spring来动态代理,spring会交由对应的service类来生成动态代理的对象,对事物方法做增加,实现事务效果。而我们的非事务方法调用事务方法时,调用其实隐藏了this.的前缀。这也就相当于直接调用的是原始的service中的普通方法,而不是被spring代理对象的代理方法。事务会失效!

(3) 事务方法的异常被捕获

        异常被事务内部直接捕获,Spring的事务管理需要感知业务方法的异常,当捕获到异常后才会回滚事务,现在事务被捕获,就会导致Spring无法感知事务异常,自然不会回滚,事务就失效了。

(4) 事务异常类型不对

        spring的事务管理默认感知的异常类型为RuntimeException,当事务方法内部抛出了一个IOException时,不会被Spring捕获,因此就不会触发事务回滚,事务就失效了。因此,当我们的业务中会抛出RuntimeException以外的异常时,应该通过@Transactional注解中的rollbackFor属性来指定异常类型。

(5) 事务传播行为不对

        当我们事物的入口为方法时,会开启一个事务,可以成为外部事物,并且在方法内部中调用了两种事务传播行为不同的方法,一个传播行为是REQUIRES_NEW,一个为默认传播行为,当我们进入REQUIRES_NEW传播行为的方法时会创建一个新事物,可以成为子事务。而默认传播行为的方法会与外部事物的方法合并事务。因此,等外部事物的方法抛出异常时,只会导致默认传播行为的方法回归,而不会导致REQUIRES_NEW传播行为的方法回滚,因为这个方法是一个独立的事务,所以,一定要慎用传播行为,注意外部事务与内部事务之间的关系。

        以上就是事务失效的五中场景,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值