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;
}
这段代码展示了如何在InnoDB数据库中使用forupdate锁来确保数据一致性。在开启的事务中,通过QueryWrapper设置last('forupdate')来锁定查询到的商品记录,然后检查库存,如果大于0,则更新库存减1,最后提交事务。这种方法可以防止并发更新导致的数据不一致问题。
1512

被折叠的 条评论
为什么被折叠?



