这里只做了一个减库存的操作,没有生成订单之类的操作,操作数据库使用的是JPA。
方案为别是:
synchronized 同步方法
乐观锁
for update 数据库排他锁
redis+lua
方案一
@RestController
public class GoodsController {
@Autowired
GoodsDao goodsDao;
@Transactional
@GetMapping("/syn_stock")
public synchronized String synStock(Integer id) {
Optional goodsOptional = goodsDao.findById(id);
Goods goods = goodsOptional.get();
int stock = goods.getStock();
if (stock <= 0) {
return "卖完了";
}
System.out.println("库存=" + stock);
goods.setStock(stock - 1);
goods = goodsDao.save(goods);
System.out.println("库存成功减 1 数据库的库存为" + goods.getStock());
}
}
方案二
@RestController
public class GoodsController {
@Autowired
GoodsDao goodsDao;
@Autowired
private ApplicationContext applicationContext;
/**
* 减库存
*
* @param id
* @return
*/
@GetMapping("/stock")
public String stock(Integer id) {
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
GoodsController goodsController =(GoodsController) applicationContext.getBean("goodsController");
Optional goodsOptional = goodsDao.findById(id);
int stock = goodsOptional.get().getStock();
if (stock <= 0) {
return "卖完了";
}
System.out.println("库存=" + stock);
//不能直接调用updateSt