1、spring @transactional 和synchronized不能同时使用
@Override
@Transactional
public Long increaseStock() {
synchronized (this) {
TblSecKill tblSecKill = tblSecKillMapper.selectByPrimaryKey(1L);
Long count = tblSecKill.getCount() + 1;
tblSecKill.setCount(count);
tblSecKillMapper.updateByPrimaryKey(tblSecKill);
logger.info("count:{};threadName:{}", count, Thread.currentThread().getName());
return count;
}
}
synchronized代码块执行是在事务之内执行的,可以推断在代码块执行完时,事务还未提交,其他线程进入synchronized代码块后,读取的库存数据不是最新的。