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 的线程同步范围比事务的要大
悲观锁解决超卖
发布于 2021-06-04 735 次阅读
COMMENTS | NOTHING