-스프링 데이터 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을 되도록 걸면 안된다
'Spring > Spring Data JPA' 카테고리의 다른 글
[스프링 데이터 JPA] Auditing (0) | 2022.03.20 |
---|---|
[스프링 데이터 JPA] @EntityGraph (0) | 2022.03.20 |
[스프링 데이터 JPA] 페이징과 정렬 (0) | 2022.03.19 |
[스프링 데이터 JPA] 파라미터 바인딩, 반환 타입 (0) | 2022.03.19 |
[스프링 데이터 JPA] 공통메서드와 쿼리 메소드 3가지, @NamedQuery, @Query (0) | 2022.03.19 |