SpringBoot中的TransactionRequiredException

我的控制器如下:


 @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;

    }

存储库是:-


@Repository

public 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 作为数据库


慕村225694
浏览 112回答 1
1回答

四季花海

这是 Spring 默认 CGLIB 代理的已知限制。由于事务行为基于代理,因此目标对象的一个方法调用其另一个方法不会导致事务行为,即使后一个方法被标记为事务性的。这可以通过在字节码中编织事务行为而不是使用代理(即使用 AspectJ)来避免。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java