Spring DATA JPA in MySQL에서 Pessimistic Lock(비관적 락) 처리

less than 1 minute read

WMS운영 중 비정상적인 락 처리 현상이 있어 확인한 결과 공유드립니다. Spring DATA JPA in MySQL에서 Pessimistic Lock(비관적 락) 처리

  • 락 어논테이션으로 처리 : @Lock(LockModeType.PESSIMISTIC_WRITE)
  • 쓰기,읽기 모두 lock를 거는 방식이지만 실제로는 읽기에 대핸 lock이 걸리지 않음
  • 읽기도 lock을 걸려면, 해당 row에 접근하는 select 쿼리에 모두 for update구문을 걸어줘야 함(@Lock(LockModeType.PESSIMISTIC_WRITE))
  • 해당 락은 row level lock이지만 mysql innoDB의 락 처리 방식은 인덱싱 되지 않은 조건으로 선별 된 row에 대해선 row level로 락은 잡지 못함
  • mysql innoDB는 인덱싱 범위에 대해서 락을 잡는 방식으로 인덱싱 되지 않은 조건으로 선별 된 select결과는 row가 아닌 테이블이 락이 걸리는 현상이 발생됨
  • 락을 걸어야 하는 데이터 셋의 검색조건은 인덱싱된 컬럼을 기준으로 잡아야 함
  • JPA에서 lock scope범위에 따라 릴레이션 된 모델들도 함께 락이 잡히게 됨
  • 대상 테이블만 락의 범위로 잡으려면 scope를 지정해줘야 함
  • 락 범위 어논테이션으로 처리 : @QueryHints(value = {@QueryHint(name = “javax.persistence.lock.scope”, value = “NORMAL”)})