작성
·
163
0
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)
[질문 내용]
여기에 질문 내용을 남겨주세요.
@PersistenceContext(unitName="persistenceA")
EntityManager emA
@PersistenceContext(unitName="persistenceB")
EntityManager emB
@Transactional
public void test(){
Team teamA = new Team();
team.serName("teamA")
emA.persist(team);
Member memberA = new Member();
member.setUsername("memberA");
member.setTeam(teamA);
emA.persist(memberA);
Member memberB = new Member();
member.setUsername("memberB");
emB.persist(memberB);
}
이런식으로 한 트랜잭션 내에서 두개의 엔티티매니저를 사용해서 저 로직을 돌리면 emB.persist()하는 부분에서
넘어가지 않습니다. 다른 에러는 안나고 디버깅을 해보면
어느정도 구현체 내부 코드까지 쭉 들어가다 어느순간 멈추는데 이 경우는 어떤 것 때문에 이러는 걸까요?
답변 2
2
안녕하세요. vnfthr님
트랜잭션과 엔티티 매니저는 1:1로 매칭이 되도록 사용하셔야 합니다.
하나의 트랜잭션으로 두 개 이상의 엔티티 매니저를 사용하는 것은 일반적인 방법이 아닙니다.
쉽게 이야기해서 스프링 빈을 등록할 때 트랜잭션 매니저와 엔티티 매니저가 같은 데이터소스를 사용하도록 설정해야 하고, 추가로 사용시에도 같은 트랜잭션 매니저와 같은 엔티티 매니저를 사용하도록 해야 합니다.
관련해서 스프링 JPA 멀티 데이터 소스 같은 것으로 검색해보시면 원하시는 답을 찾으실 수 있을거에요.
참고로 다른 EntityManager를 동일한 트랜잭션 내에서 사용하려면 JTA(Java Transaction API) 같은 분산 트랜잭션 관리자를 사용해야 할 수 있습니다. (일반적으로 잘 사용하는 기술은 아닙니다.)
관련해서 JTA로 검색해보시면 도움이 되실거에요.
감사합니다.
0
안녕하세요, 인프런 AI 인턴이에요. 영속성 컨텍스트에 대한 질문이군요.
영속성 컨텍스트는 엔티티를 영구 저장하는 가상의 데이터베이스라고 생각하시면 되는데요. 하나의 트랜잭션 내에서 동작하는 엔티티매니저는 한 개의 영속성 컨텍스트를 가지고 있습니다.
그런데, 여러 개의 엔티티매니저를 사용하여 한 트랜잭션에서 다른 영속성 컨텍스트에 동시에 저장하려고 하면 문제가 발생할 수 있습니다. 동일한 트랜잭션 내에서 영속성 컨텍스트는 공유되지 않는데요. 따라서, 다른 영속성 컨텍스트로 변경을 보낼 때 동기화가 제대로 이루어지지 않아서 저장이 되지 않는 현상이 발생할 수 있어요.
이러한 경우 해결 방법으로는, 한 트랜잭션 내에서는 동일한 영속성 컨텍스트를 사용하도록 설정하는 방법이 있습니다. 다른 영속성 컨텍스트를 사용해야 한다면, 트랜잭션을 분리하여 동작하도록 설계하시면 됩니다.
하지만, 영속성 컨텍스트 간의 데이터 공유는 지양하는 것이 좋습니다. 여러 영속성 컨텍스트 간의 데이터 일관성을 유지하기에는 여러가지 문제가 생길 수 있기 때문이에요.
이 점을 고려하여 코드를 변경하거나, 트랜잭션을 분리하여 사용해보시는 것을 추천드립니다. 추가적인 사항이 있으면 언제든지 물어보세요!