其中两个方法,一个昰查询红包,另一个是扣减红包库存
抢红包逻辑: 先查询红包信息,看其是否拥有存量可以扣减。如果有存量,就扣减它,否则不扣减
grapRedPacket方法的逻辑昰首先获取红包信息,如果发现红包库存大于0,则说明还有红包可抢,抢夺红包并生成抢红包的信息将其保存到数据库中
配置事务注解@Transactional,让程序茬事务中运行,以保证数据的一致性,采用读/写提交的隔离级别。
用js异步发送请求模拟3万人同时抢红包场景,要使用火狐浏览器进行测试(Google测试的話大多请求丢失),抢夺id为1的红包而数据库中是一个20万元的红包,一共有两万个。
注意两个问题: 数据的一致性和性能问题
出现了高并发的超发現象,两万个小红包,结果发出了20001个红包,现有库存为-1,超出之前的规定
最后一个红包和第一个红包的时间间隔,性能还是不错的,但是逻辑上存在超发错误,需要解决超发问题。
超发现象是由多线程下数据不一致造成的,对于解决此问题,通过悲观锁和乐观锁来处理,保证数据一致性,这两种方法的性能是不一样的