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操作。