@Override
@Transactional(rollbackFor = Exception.class)
public synchronized SyTaskChildDO initTaskChild(SyTaskChildQueryParam param) {
try {
List<SyTaskChildDO> taskCidList = syTaskChildDAO.listByParam(param);
if(taskCidList.isEmpty()){
return null;
}
SyTaskChildDO childDO = taskCidList.get(0);
childDO.setState(TaskStateEnum.IN_EXECUTE.getCode());
//修改任务状态为执行中
Long childNum = syTaskChildDAO.update(childDO);
if(childNum<1){
return null;
}
return childDO;
} catch (Exception e) {
LOGGER.error("SyTaskChildManageServiceImpl initTaskChild Exception",e);
throw e;
}
}
在同步方法上面添加了事务,这样会导致锁不住。
原因:spring@Transactional注解使用的是AOP来实现,也就是说被@Transactional注解的方法的事务是由spring生成的一个代理类来处理的,当一个线程执行完该方法并释放锁后,代理类还没有提交事务前,别的线程是有机会进入到该方法中的,这样一来,就有几率访问到过期的数据,从而导致并发问题。