일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 자료구조공부
- nestjs
- JPA 공부
- 카프카
- DDD
- 기술공부
- Flutter
- 알고리즘공부
- 플러터 개발
- 기술면접공부
- JPA
- 코테준비
- 프로그래머스
- 스프링부트
- JPA예제
- 스프링 공부
- JPA공부
- nestjs공부
- 스프링공부
- 자바공부
- 스프링
- querydsl
- 스프링부트공부
- K8S
- JPA스터디
- Kafka
- nestjs스터디
- Axon framework
- 코테공부
- 플러터 공부
- Today
- Total
DevBoi
[JPA] 비관적 락 과 낙관적 락 본문
낙관적 락
일단, 트랜잭션 충돌이 발생하지 않는다고 가정한다.
DB가 제공하는 락을 사용하지 않고, JPA가 제공하는 Version 관리을 사용한다
트랜잭션을 커밋하기 전까지 충돌을 알수 없다.
낙관적락
이렇게 메소드에서 사용할 수 있다.
해당으로 사용하게 되면, 트랜잭션이 커밋될때, version을 업데이트하게 된다.
@Version으로 명시된 컬럼이 증가하게되고, 해당 증가후에 트랜잭션이종료하게 된다.
만약에 다른 트랜잭션에서 어떤값을 수정하려고할때, 해당 버전에 대한 값을 확인후에, 버전이 같으면, 수정
다르면 예외를 발생시킨다.
LockModeType 중에 OPTIMISTIC_FORCE_INCREMENT가 있다.
해당 방식일때는 조회만으로 version이 update된다. update 도 version이 update 된다. (2번 version이 바뀔수 있다.)
즉, 해당 어노테이션을 사용하게되면 조회만으로 락을 걸수있다.
다른말로 하면, 한 트랜잭션이 조회한 것만으로 version을 update시켜, 다른 트랜잭션에서 update가 불가하게 만들수 있다
정리)
- A가 table의 Id 2번을 읽음 ( name = Karol, version = 1 )
- B가 table의 Id 2번을 읽음 ( name = Karol, version = 1 )
- B가 table의 Id 2번, version 1인 row의 값 갱신 ( name = Karol2, version = 2 ) 성공
- 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 |