为了账号安全,请及时绑定邮箱和手机立即绑定

SpringBoot中的TransactionRequiredException

SpringBoot中的TransactionRequiredException

慕村225694 2023-09-06 15:47:38
我的控制器如下: @GetMapping("/groupByCourse")    public Reply getStudentsCountByCourse(){        Reply reply=new Reply();        reply.setData(service.getStudentsCountByCourse());        return reply;    }服务是:-public List getStudentsCountByCourse()  {            List students=new ArrayList<>();            students=studentCourseRepo.findCountStudentByCourse();            getCourseCountByStudent();        return students;    }    @Transactional(Transactional.TxType.REQUIRES_NEW)   public List getCourseCountByStudent()  {            List students=new ArrayList<>();            students=studentCourseRepo.findCountCourseByStudent();        return students;    }存储库是:-@Repositorypublic interface StudentCourseRepo  extends CrudRepository<StudentCourseTbl, StudentCourseTblPK> {    @Query(value = "select  sc.studentCourseTblPK.courseId,count(sc.studentCourseTblPK.studentId) from StudentCourseTbl sc group by sc.studentCourseTblPK.courseId")    List findCountStudentByCourse();    @Lock(LockModeType.PESSIMISTIC_WRITE)    @Query(value = "select  s.id,s.name,count(sc.studentCourseTblPK.courseId) from StudentCourseTbl sc  right join StudentsTbl s on sc.studentCourseTblPK.studentId=s.id group by s.id")    List findCountCourseByStudent();}我已经在我的服务方法中使用 @Transactional(Transactional.TxType.REQUIRES_NEW) 来使用 Pessimistic_write 锁执行查询,但即使在事务模式设置为需要新之后,我仍然收到TransactionRequiredException 。我知道我可以通过使用使代码工作我的 getStudentsCountByCourse 方法上的 @Transactional 注释,但我想知道它当前不起作用的原因。我正在使用 springboot 版本 2.1.7.Release 并使用 mysql 作为数据库
查看完整描述

1 回答

?
四季花海

TA贡献1811条经验 获得超5个赞

这是 Spring 默认 CGLIB 代理的已知限制。由于事务行为基于代理,因此目标对象的一个方法调用其另一个方法不会导致事务行为,即使后一个方法被标记为事务性的。

这可以通过在字节码中编织事务行为而不是使用代理(即使用 AspectJ)来避免。

查看完整回答
反对 回复 2023-09-06
  • 1 回答
  • 0 关注
  • 111 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信