抢票系统防超卖的方法

remain是库存

传统的更新是先查出来库存,把原库存量减去当前顾客购买数量,再用jpa自带的save方法保存库存量,

但这有一个问题是存在多名顾客同时购买的情况,

比如仅剩一张票时,两个顾客同时购买,同时查出来的库存都是1,都进行了save操作,则会超卖

为避免超卖,应该确保在更新数据库的库存时,增加更新的条件,只有此刻数据库里的库存与之前查询出来的一致时,才会更新库存,

而库存不一致时,虽然不报错,但是update语句可以返回整数表示几行受影响,可以用来确定更新是否成功;

在jpa的接口里用jpql写

代码如下:

@Modifying
	@Query(value = "update Activity set remain = ?1-1 where id=?2 and remain>0 and remain= ?1 ")
	//@Query(value="select remain from Activity  ")
	@Transactional
	int updateRemain(int remain, int id) ;

因为是update语句,要用@Modifying来修饰

  • @Modifying注解

    1、在@Query注解中编写JPQL实现DELETE和UPDATE操作的时候必须加上@modifying注解,以通知Spring Data 这是一个DELETE或UPDATE操作。

    2、UPDATE或者DELETE操作需要使用事务,此时需要 定义Service层,在Service层的方法上添加事务操作。

    3、注意JPQL不支持INSERT操作。  

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页