for update 仅适用于InnoDB,并且必须开启事务,在begin与commit之间才生效。
@Override
@Transactional(isolation = Isolation.READ_COMMITTED)
public int decrGoodsAmountByLock(long id) {
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.eq("id",id);
queryWrapper.last("for update");
Goods goods = baseMapper.selectOne(queryWrapper);
if (goods.getAmount()>0){
UpdateWrapper updateWrapper = new UpdateWrapper();
updateWrapper.setSql("amount=amount-1");
updateWrapper.eq("id",id);
return baseMapper.update(null,updateWrapper);
}
return 0;
}