不知大家是否有遇到过类似情况,在同一个service层,需要调用自身存在事务的方法,如代码所示.
@Service
public class StudentServiceImpl implements IStudentService {
@Transactional(rollbackFor = Exception.class)
@Override
public void list() {
this.deleteStudent(1);
}
@Transactional(propagation = Propagation.NEVER, rollbackFor = Exception.class)
@Override
public void deleteStudent(Integer id) {
System.out.println("删除一个学生");
}
}
deleteStudent()的事务类型为NEVER,表示当调用方调用该方法时,若调用方存在事务,就会报错,可事实上,执行list()方法并不会报错,而且还正常打印输出了,这就说明deleteStudent()的事务失效了
解决办法:
1.将deleteStudent()方法放到通用service层或者放到其他service层,反正不要放到自身里就行(此方法可行,不过比较low)
2.在该service类中注入自己,通过注入的属性去调用方法,可以保证事务不失效,如下代码所示
@Service
public class StudentServiceImpl implements IStudentService {
@Autowired
private IStudentService studentService;
@Transactional(rollbackFor = Exception.class)
@Override
public void list() {
studentService.deleteStudent(1);
}
@Transactional(propagation = Propagation.NEVER, rollbackFor = Exception.class)
@Override
public void deleteStudent(Integer id) {
System.out.println("删除一个学生");
}
}
此方法简单快捷,个人推荐使用
最后,有人可能会有这样的疑惑,为什么调用自身方法事务会失效?为什么自己注入自己不会导致死循环?有兴趣的朋友可以去了解一下spring动态代理和spring如何解决循环依赖问题,看完后你就会豁然开朗了