• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

벌크연산 관련 질문드립니다

21.06.03 23:10 작성 조회수 117

0

안녕하세요 강사님. 강의 듣다가 의문점이 하나 있어서 질문드립니다.

bulk update 후 동일 트랜잭션 내에서 엔티티를 조회했을때 영속성 컨텍스트에 update 결과가 반영안되는것까진 확인했습니다.

그런데 bulk delete 후에 엔티티를 조회하면 delete 결과가 반영이 되어있더라고요. (27강 12분 25초 delete문을 날린 후 Member 조회시 1개가 나옵니다)

그 이유가 궁금합니다. 결국 벌크연산에서 update문만 조심하면 되는건가요?

답변 2

·

답변을 작성해보세요.

0

안녕하세요. skaansxo1님

다음 코드를 주석을 보면서 돌려보시면 이해가 되실거에요.

    @Test
public void bulkDelete() {

long count = queryFactory
.delete(member)
.where(member.age.gt(20))
.execute();

assertThat(count).isEqualTo(2);

// em.flush();
// em.clear();

List<Member> result = queryFactory
.selectFrom(member)
.fetch();

assertThat(result.size()).isEqualTo(2); //4개를 기대했는데 2개만 조회
//JPQL을 사용하면 SQL을 실행해서 DB에 있는 데이터를 기준으로 조회
for (Member member1 : result) {
System.out.println("member1 = " + member1);
}

//하지만 회원 3,4는 영속성 컨텍스트에 아직 남아있음(위험함)
//em.find()로 조회하면 영속성 컨텍스트를 먼저 찾음
//따라서 delete 벌크 연산 후 em.clear()로 영속성 컨텍스트를 초기화 하는 것이 안전함
Member member3 = em.find(Member.class, member3Id);
assertThat(member3).isNotNull();

Member member4 = em.find(Member.class, member4Id);
assertThat(member4).isNotNull();

}

감사합니다.

0

안녕하세요. skaansxo1님

뭔가 좀 이상하네요. 코드를 봐야할 것 같아요.

전체 프로젝트를 압축해서 zipkyh@naver.com으로 메일 보내주세요.

메일 보내실 때는 다음 사항을 꼭 지켜주세요.

1. 인프런 질문 링크를 걸어주세요.

2. 실행 방법을 알려주세요.

3. 어떻게 문제를 확인할 수 있는지 자세한 설명을 남겨주세요.

감사합니다.