TransactionRequiredException в SpringBoot - PullRequest
       42

TransactionRequiredException в SpringBoot

0 голосов
/ 27 сентября 2019

мой контроллер выглядит следующим образом:

 @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 даже после установки режима транзакции, требующего нового. Я знаю, что могу заставить код работатьс помощью аннотации @Transactional в моем методе getStudentsCountByCourse, но я хочу знать причину, по которой он не работает в настоящее время.

Я использую Springboot версии 2.1.7. Пожалуйста, используйте mysql в качестве базы данных

1 Ответ

1 голос
/ 27 сентября 2019

Это известное ограничение прокси-серверов CGLIB по умолчанию Spring.Поскольку поведение транзакций основано на прокси, метод целевого объекта, вызывающий другой метод, не приведет к поведению транзакций, даже если последний метод помечен как транзакционный.

Этого можно избежать, соткнувтранзакционное поведение внутри байт-кода вместо использования прокси, т.е. с использованием AspectJ.

Подробнее об управлении весенними транзакциями можно прочитать здесь Видимость метода и @ Transactional

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...