트랜잭션을 중첩해서 사용하는 방법이 있을까요?
311
작성한 질문수 2
안녕하세요,
Spring없이 JPA를 적용하여 데스크탑 애플리케이션을 만들어 보던 중,
궁금한 점이 생겨 질문드립니다.
// AbstractDao
public void transaction(EntityManagerRunable runnable) {
EntityManager em = createEntityManager();
EntityTransaction transaction = em.getTransaction();
try {
transaction.begin();
runnable.run(em);
transaction.commit();
} catch (Throwable e) {
if (transaction.isActive()) {
transaction.rollback();
}
throw new RuntimeException(e);
} finally {
em.clear();
em.close();
}
}
// MemberDao
public Member findByName(String name) {
return transaction((em) -> {
return em.createQuery("select r from Member m where m.name = :name", Member.class)
.setParameter("name", name)
.getSingleResult();
}
// MemberDao
public void updateTeam(String name, String team) {
transaction((em) -> {
Member findMember = findByName(name);
findMember.changeTeam(team);
});
}
위와 같이 AbstractDao와 MemberDao의 메서드가 구성되어 있는 상태에서
MemberDao에서 updateTeam 메서드를 호출하면 변경감지가 되지 않아, 업데이트 쿼리가 나가지 않습니다.
안쪽의 트랜잭션 (findByName의 트랜잭션)이 종료되고, findMember 객체는 바깥쪽 트랜잭션 안에서 영속 상태가 아니기 때문에 team 필드 변경에도, 변경감지가 되지 않는 것 같다고 판단이 됩니다.
그러면, Spring의 propagation옵션 같이 중첩된 트랜잭션들을 한 개의 트랜잭션처럼 동작하도록 구성할 수 있을까요?
조언 부탁드립니다.
답변 1
0
안녕하세요. melo님
코드로 트랜잭션을 전파하는 방식으로 구현하는 것은 매우 어렵습니다. 이전 트랜잭션 정보를 찾아야 하는데 이 부분이 까다롭습니다. 그런데 크게 고민하지 않아도 되는 이유는 실무에서는 보통 스프링과 JPA를 함께 사용하기 때문에 스프링의 @Transactional을 사용해서 JPA 트랜잭션도 자연스럽게 전파할 수 있습니다.
관련해서 활용1편에서 이런 방식으로 처리합니다.
감사합니다.
실무 조언 관련 질문입니다.
0
38
1
H2데이터베이스 파일 생성
0
47
2
서브쿼리 강의에서 ALL 예시 관련 질문드립니다.
0
49
2
수정또는 삭제시 영속성 엔티티에 값이 무조건 있어야 하나요?
0
46
1
JPQL 메소드와 락
0
48
1
Delivery @OneToOne
0
55
1
17강 4~5분대 테이블 값 조회가 안됩니다.
0
85
2
UnsupportedOperationException 발생
0
80
3
H2 Database 연결이 안됩니다.
0
87
2
연관관계 매핑 질문드립니다.
0
78
2
h2데이터베이스 실행오류
0
103
2
persistence.xml
0
101
2
양방향 연관관계에서 연관관계의 주인(mappedBy)을 왜 꼭 정해야 하나요?
0
75
1
영속성 컨텍스트
0
61
1
JPA 프록시
0
87
1
Native Query와 MyBatis
0
62
1
영속성 컨텍스트는 어떤 메모리에 저장되는건가요?
0
81
1
임베디드 타입 예시 코드 관련 질문
0
110
3
명시적 조인에서 별칭을 주면 왜 객체에 접근할 수 있나요
0
89
3
인텔리제이 패키지 커서 단축키 질문
0
103
2
혹시 현재는 ID 데이터 타입이 String이면 안되나요?
0
134
1
양방향 연관관계 시 연관관계 주인을 설정하는 이유
0
67
1
임베디드 타입과 MappedSuperClass의 차이점이 궁금합니다.
0
95
1
데이터베이스가 초기화되는 것 같아요
1
172
2





