因为是逐步积累,所以一开始遇到的问题也不会很多。
错1:在@Transactional方法上同时加入synchronized关键字
场景:
写法如下,刚开始遇到时不懂,后来因为前段处理不当,到后台有几率必定出现多次重复请求,才发现使用了synchronized无效
@Service
class GameService{
@Transactional(rollbackFor = Exception.class)
public synchronized void receiveDuckEgg(BaseUser baseUser) throws Exception {
//...
}
}
解释:
这种写法会造成在事务未提交前,又执行了一次synchronized方法,而因为事务未提交,所以synchronized方法虽然同步,但是还是会造成脏读。导致处理数据错误的问题。
处理方法:
既然是因为同步synchronized在事务@Transactional之内,而产生的问题。那么我们只要让synchronized的调用层级》事务@Transactional即可,保证事务提交前不能进入同步方法中。可以写一个没有带事务的同步方法,调用另一个service需要执行事务处理的逻辑方法,如:其中a方法为其他service方法(自己测试验证过,暂时不知道专业回答是什么,但是理解上是先进行同步方法直到另一个service层处理完毕[事务处理完毕],才结束阻塞执行下一次方法调用)
@Service
class aaa{
@Autowired
private GameService gameService;
public synchronized void a() throws Exception{
gameService.receiveDuckEgg();
}
}