为了方便操作数据库用的是JPA
第一个坑:JPA的一级缓存,导致查询死循环
代码:
@RestController
public class GoodsController {
@Autowired
GoodsDao goodsDao;
/**
* 减库存
* @param id
* @return
*/
@Transactional
@GetMapping("/stock")
public String stock(Integer id) {
Optional<Goods> goodsOptional = goodsDao.findById(id);
int stock = goodsOptional.get().getStock();
if (stock <= 0) {
return "卖完了";
}
System.out.println("库存="+stock);
//为了演示遇到的第一个坑,后续会去掉
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Integer result = goodsDao.updateStockById(stock - 1, stock, id);
if (result == 0) {
stock(id);
}
return "成功";
}
/**
* 库存 -1
* @param id
* @return
*/
@Transactional
@GetMapping("/reduce_stock")
public String reduce_stock(Integer id) {
Optional<Goods> goodsOptional = goodsDao.findById(id);
Goods goods = goodsOptional.get();
int stock = goods.getStock();
goods.setStock(stock-1);
goods= goodsDao.save(goods);
System.out.println("库存成功减 1 数据库的库存为"+goods.getStock());
return "成功";
}
}
-----------------------------------------------------------
Dao的代码:
public interface GoodsDao extends JpaRepository<Goods,Integer>, JpaSpecificationExecutor<Goods> {
@Transactional
@Query(value = "update goods set stock=?1 where stock=?2 and id=?3 ", nativeQuery = true)
@Modifying
Integer updateStockById(Integer stock,Integer old_stock , Integer id);