-스프링 데이터 JPA를 사용한 벌크성 수정 쿼리

@Modifying
@Query("update Member m set m.age = m.age + 1 where m.age >= :age")
int bulkAgePlus(@Param("age") int age);

 

벌크성 수정, 삭제 쿼리는 @Modifying 어노테이션을 사용해야한다

사용하지 않으면 다음과 같은 오류가 발생한다 

org.hibernate.hql.internal.QueryExecutionRequestException: Not supported for DML operations
 

주의:

벌크 연산은 영속성 컨텍스트를 무시하고 바로 db 값을 업데이트 하기 때문에, 같은 객체에 대해서 디비와 영속성 컨텍스트의 값이 다를 있다

 

해결:

1. 영속성 컨텍스트에 엔티티가 없는 상태에서 벌크 연산을 먼저 실행한다

2. 부득이하게 영속성 컨텍스트에 엔티티가 있으면 벌크 연산 직후 영속성 컨텍스트를 초기화 한다 

 

스냅샷: 영속성 컨텍스트가 생성될 때, 향후 변경 감지를 위해서 원본을 복사해서 만들어두는 객체 

변경 감지가 일어났을 때 1차 캐시에 있는 원본 객체가 중간에 변경되었는지 스냅샷을 통해 확인 

실시간 트래픽이 많은 상황에서는 Lock 되도록 걸면 안된다 

+ Recent posts