작성
·
767
·
수정됨
0
안녕하세요 스프링 데이터 접근 기본 1편 에 강의 내용 중 JpaTransactionManager와 DatasourceTransactionManager를 같이 사용할 경우 JpaTransactionManager 를 사용하면 된다고 하셨는데 관련해서 궁금한 것이있습니다.
Jpa와 myBatis를 같이 사용 할 경우 반드시 JpaTransactionManager를 사용해야 하는지 궁금합니다. 현재 JBPM 이라는 오픈소스를 근간으로 하는 솔루션을 개발 중인데 해당 오픈소스 엔진영역은 JPA를 사용하고 나머지 Service class에는 myBatis를 사용 중입니다. 현재 직면하고있는 문제는 일반 서비스 클래스에서 DatasourceTransactionManager로 트랜잭션이 이어지는 중에 JpaTransactionManager를 사용하고 있는 클래스를 호출 하게 되면 JpaTransactionManager 의 getTransaction() 메서드에서 unable to begin transaction 이라는 에러가 발생합니다. 현재 AOP 로 일괄적으로 2개의 트랜잭션매니저를 사용 하고 있는데, AOP DatasourceTransactionManager 를 주석 처리 하니까 에러가 발생하지 않습니다. 2개의 트랜잭션매니저를 사용해서 발생하는 문제 일까요? 그렇다면 JpaTransactionManager 하나만 사용하면 될까요 ?
영한님 께서 트랜잭션이 시작되면 TransactionManager에서 커넥션을 생성하고 쓰레드로컬에 해당 커넥션을 저장한다고 하셨는데, 2개의 트랜잭션 매니저를 사용해서, A 라는 트랜잭션매니저를 사용하고있는 메서드에서 B라는 트랜잭션매니저를 사용하는 메서드를 호출하면, 2개의 커넥션이 생성되는 것인가요 ?
답변 1
0
안녕하세요, 인프런 AI 입니다.
JPA와 Mybatis를 같이 사용할 경우, JpaTransactionManager를 사용해야 하는 것은 아닙니다. 하지만, JPA를 사용하는 클래스와 다른 데이터 액세스 기술을 사용하는 클래스를 같은 트랜잭션 내에서 사용할 경우, JpaTransactionManager를 사용하여 트랜잭션을 관리해야 합니다.
또한, DatasourceTransactionManager와 JpaTransactionManager를 같이 사용할 경우, JpaTransactionManager만 사용해도 충분합니다. 두 트랜잭션 매니저를 함께 사용할 경우, 트랜잭션 충돌이 발생할 수 있기 때문입니다.
위에서 언급하신 오류는 2개의 트랜잭션 매니저를 함께 사용했을 때 발생하는 문제입니다. 따라서 JpaTransactionManager 하나만 사용하도록 변경해야 합니다.
감사합니다.