DevBoi

[JPA] 비관적 락 과 낙관적 락 본문

Develop/[JPA]

[JPA] 비관적 락 과 낙관적 락

HiSmith 2022. 3. 21. 21:51
반응형

낙관적 락

일단, 트랜잭션 충돌이 발생하지 않는다고 가정한다.

DB가 제공하는 락을 사용하지 않고, JPA가 제공하는 Version 관리을 사용한다

트랜잭션을 커밋하기 전까지 충돌을 알수 없다.

 

낙관적락

이렇게 메소드에서 사용할 수 있다.

해당으로 사용하게 되면, 트랜잭션이 커밋될때, version을 업데이트하게 된다.

@Version으로 명시된 컬럼이 증가하게되고, 해당 증가후에 트랜잭션이종료하게 된다.

만약에 다른 트랜잭션에서 어떤값을 수정하려고할때, 해당 버전에 대한 값을 확인후에, 버전이 같으면, 수정

다르면 예외를 발생시킨다.

 

LockModeType 중에  OPTIMISTIC_FORCE_INCREMENT가 있다.

해당 방식일때는 조회만으로 version이 update된다. update 도 version이 update 된다. (2번 version이 바뀔수 있다.)

즉, 해당 어노테이션을 사용하게되면 조회만으로 락을 걸수있다.

다른말로 하면, 한 트랜잭션이 조회한 것만으로 version을 update시켜, 다른 트랜잭션에서 update가 불가하게 만들수 있다

 

정리)

  1. A가 table의 Id 2번을 읽음 ( name = Karol, version = 1 )
  2. B가 table의 Id 2번을 읽음 ( name = Karol, version = 1 )
  3. B가 table의 Id 2번, version 1인 row의 값 갱신 ( name = Karol2, version = 2 ) 성공
  4. A가 table의 Id 2번, version 1인 row의 값 갱신 ( name = Karol1, version = 2 ) 실패
    • Id 2번은 이미 version이 2로 업데이트 되었기 때문에 A는 해당 row를 갱신하지 못함

 

 

 

비관적 락

트랜잭션이 일단 충돌한다고 가정하고 락을 건다

DB가 제공하는 락을 사용한다. (Select for update)

데이터를 수정하면 즉시 충돌을 알 수 있다.

 

해당 Lock을 비관적 락으로 걸게되면, 쿼리가 select for update로 나가게된다.

해당 쿼리는 DB에서 락을 거는 방법인데, 해당 락을 걸게 되면

특정 세션에서 디비에 대한 수정을 완료할때까지 다른 세션은 해당 row를 접근할 수 없게 락을 걸어버리는것이다.

 

반응형

'Develop > [JPA]' 카테고리의 다른 글

[JPA] 모델 설계 및 구현  (0) 2022.09.08
[JPA] Page 기능 개발  (0) 2022.03.21
[JPA] JPA 플러시란  (0) 2022.03.21
[JPA] JPA 격리수준  (0) 2022.03.21
[JPA] JPA 와 하이버네이트의 차이  (0) 2022.03.21