Home Mybatis学习 悲观锁解决超卖

悲观锁解决超卖

public synchronized Integer kill(Integer id, HttpSession session) {
    //根据 商品 ID 校验库
    Stock stock = checkStock(id);
    LOGGER.info("商品的名称为:" + stock.getName());
    LOGGER.info("商品的已售为:" + stock.getSaled());
    LOGGER.info("商品的库存为:" + stock.getCount());
    //更新库存
    updateSale(stock);
    //创建订单
    return createOrder(stock,session);
}

尝试给 kill 方法加悲观锁解决超卖

坑点:synchronized 加在业务层,而业务层加了事务控制,加入事务控制会导致线程同步(事务的)
而synchronized 也有一个线程同步,事务的线程同步的范围比synchronized 的大

当我们的synchronized 代码块确实能保证线程排队走,但是synchronized 代码块结束之后,事务还没结束,这个线程已经把锁释放了
但事务还未结束,事务还没提交,此时下一个线程已经来了,来了之后,此时事务开始提交,下一个线程执行了,执行的时候数据库也跟着提交
这样就有可能出现多次提交的问题,所以即使在业务层加上synchronized 也会出现超卖问题

解决方案:
1. 去掉事务
2. synchronized 放在我们的Controller  调用处,保证synchronized 的线程同步范围比事务的要大

发表评论

发表评论