@version에 해당하는 글 1

  1. [JPA] LockType2020.07.23

[JPA] LockType

JAVA/Spring|2020. 7. 23. 19:16

주로 업무상 디비 락이 필요한경우 Select for update를 주로 활용했는데
optimistic lock을 JPA에서 편리하게 사용할수 있게 지원하고 있어
테스트를 하며 정리해봤습니다.
(@Version이 있고 없고, 변경사항이 있을때 어떤 쿼리가 발생하는지 등)

작성한 github 위치 : https://github.com/Meteorkor/JPA_Study/edit/master/docs/LockType.md

테스트 코드는 추후 정리해서 업로드 예정입니다.

LockModeType

  • OPTIMISTIC

    • 트랜잭션 중 변경사항이 있을때
      • SELECT : 이때 버전을 같이 가져옴(해당 필드에 @Version, org.springframework.data.annotation.Version 가 아니라 javax.persistence.Version)
      • UPDATE : 이때 앞에서 Select한 version을 where에, set절에는 version=version+1 으로 version 업데이트
        • UPDATE 된 값이 없으면 중간에 버전이 변경된것으로 파악하여 에러 발생
    • 트랜잭션 중 변경사항이 없을때
      • SELECT : 이때 버전을 같이 가져옴(해당 필드에 @Version, org.springframework.data.annotation.Version 가 아니라 javax.persistence.Version)
      • SELECT : 이때 앞에서 Select한 version을 where에, 조회된 결과가 없으면 에러 발생
    • 수정을 하게 되면 version은 한개씩 올라감, 수정을 하지 않으면 version은 올라가지 않음
  • OPTIMISTIC_FORCE_INCREMENT

    • 트랜잭션 중 변경사항이 있을때
      • SELECT : 이때 버전을 같이 가져옴(해당 필드에 @Version, org.springframework.data.annotation.Version 가 아니라 javax.persistence.Version)
      • UPDATE : 이때 앞에서 Select한 version을 where에, set절에는 version=version+1 으로 version 업데이트
        • UPDATE 된 값이 없으면 중간에 버전이 변경된것으로 파악하여 에러 발생
      • UPDATE : Version을 한번 더 업데이트
    • 트랜잭션 중 변경사항이 없을때
      • SELECT : 이때 버전을 같이 가져옴(해당 필드에 @Version, org.springframework.data.annotation.Version 가 아니라 javax.persistence.Version)
      • UPDATE : Version을 업데이트
    • 수정을 하게 되면 version은 두개씩 올라감
    • 수정을 하지 않으면 version은 한개씩 올라감
  • READ(OPTIMISETIC과 동작 같음)

  • WRITE(OPTIMISTIC_FORCE_INCREMENT 과 동작 같음)

  • PESSIMISTIC_READ

    • @Version이 없는 경우
      • 트랜잭션 중 변경사항이 없을때
        • SELECT FOR UPDATE
      • 트랜잭션 중 변경사항이 있을때
        • SELECT FOR UPDATE - UPDATE
    • @Version이 있는 경우
      • 트랜잭션 중 변경사항이 없을때
        • SELECT FOR UPDATE
      • 트랜잭션 중 변경사항이 있을때
        • SELECT FOR UPDATE - UPDATE(version도 함께 올라감)
  • PESSIMISTIC_WRITE

    • @Version이 없는 경우
      • 트랜잭션 중 변경사항이 없을때
        • SELECT FOR UPDATE
      • 트랜잭션 중 변경사항이 있을때
        • SELECT FOR UPDATE - UPDATE
    • @Version이 있는 경우
      • 트랜잭션 중 변경사항이 없을때
        • SELECT FOR UPDATE
      • 트랜잭션 중 변경사항이 있을때
        • SELECT FOR UPDATE - UPDATE(version도 함께 올라감)
  • PESSIMISTIC_FORCE_INCREMENT

    • @Version이 없는 경우
      • 에러 발생
    • @Version이 있는 경우
      • 트랜잭션 중 변경사항이 없을때
        • SELECT FOR UPDATE - update version
      • 트랜잭션 중 변경사항이 있을때
        • SELECT FOR UPDATE - update version - updateUPDATE(version도 함께 올라감)
  • NONE

'JAVA > Spring' 카테고리의 다른 글

SpringBoot App에 외부 libs 추가  (0) 2023.11.19
[Spring] SessionStatus는 어떻게 동작할까?  (5) 2020.09.08
[Spring] LifeCycle, SmartLifeCycle  (0) 2020.06.23
[MSA] sidecar 패턴  (0) 2020.01.13
[SpringConfig] Properties 암호화  (0) 2019.12.24

댓글()