@Transactional(propagation = Propagation.REQUIRES_NEW)
·
Java & Spring/트러블슈팅
주요 특징:새로운 트랜잭션 생성: 메소드가 호출될 때 기존 트랜잭션이 있더라도 그것을 무시하고 항상 새로운 트랜잭션을 생성한다.독립적인 트랜잭션: 이 새로운 트랜잭션은 기존 트랜잭션과 완전히 독립적으로, 새로 시작된 트랜잭션이 커밋되거나 롤백되더라도, 기존 트랜잭션에는 영향을 미치지 않는다.원래 트랜잭션 중단: 새로운 트랜잭션이 끝날 때까지 기존 트랜잭션은 중단된다. 새로운 트랜잭션이 완료된 후에 기존 트랜잭션이 다시 이어진다.부분 커밋: 메소드 실행 중에 새로운 트랜잭션이 성공적으로 커밋되면, 그 결과는 전체 트랜잭션의 성공 여부와 상관없이 데이터베이스에 영구적으로 반영된다. 즉, 새 트랜잭션이 커밋되면 그 변경 사항은 롤백되지 않는다.□ 문제사항 @Transactional public Ma..
MultipleBagFetchException(두개의 Fetch Join)
·
Java & Spring/트러블슈팅
- 문제상황 List results = jpaQueryFactory .selectFrom(todo) .leftJoin(todo.managers).fetchJoin() .leftJoin(todo.comments).fetchJoin() .where(condition) .offset(pageable.getOffset()) .limit(pageable.getPageSize()) .fetch();todo조회 시 manager와 comment의 개수를 출력하면서 N+1문제를 해결하기 위해 Fetch Join을 연속으로..
Self-invocation(자기 호출)
·
Java & Spring/트러블슈팅
Self-invocation(자기 호출)이란? Self-invocation(자기 호출)은 클래스 내의 메서드가 동일 클래스의 다른 메서드를 호출하는 상황에서 발생Spring 프레임워크에서 @Transactional 어노테이션을 사용할 때, 이 self-invocation은 문제가 발생할 수 있다.그 이유는 Spring의 트랜잭션 관리가 AOP(Aspect-Oriented Programming) 기반의 프록시(Proxy)를 사용하기 때문이다. Self-invocation이 왜 문제가 되는가?프록시는 트랜잭션 시작, 커밋 또는 롤백을 처리하는데, 자기 호출이 발생할 경우 프록시가 아닌 실제 객체가 메서드를 호출하게된다.이로 인해 트랜잭션 관리가 적용되지 않고, 예상대로 트랜잭션이 시작되지 않거나 커밋되지 ..