背景 商品秒杀
- 条件: 限定用户在活动期间只能参加一次, 不能超卖
- 环境: springBoot
处理方法
service方法上加了事务和锁
加锁是因为,并发下多个线程同时进行操作有可能导致超卖
service
public void doKill(){ if(! condition) { return; } try{ Lock.lock(); // 这个锁可能是个全局的锁 if(! condition) { return; } doSomeThing(); // thows BusinessException }finally { Lock.unock(); } } @Transectional public void doSomeThing(){ }
注意:
假如在事务的service调用另外一个事务方法, 那么事务是不会生效的
可以在serviceImpl 里面再注入自己
注意假如doKill方法上加事务,可能会出现问题, 因为锁释放了事务还没提交
所以一定要保证事务结束后才释放锁