Database Transaction Lock With JPA
데이터베이스의 Transaction Lock은 두가지 방식이 있다.
1. 낙관적 잠금
- 다른 transaction이 수정이 할수가 있다.
- version 컬럼을 두어 version 이 달라지는 경우 충돌을 알려준다.
- JPA에서의 @Version 기능, 버전이 달라질 경우에는 OptimisticLockException 에러가 발생이 된다.
@Lock Annotation
- LockModeType.OPTIMISTIC
- LockModeType.OPTIMISTIC_FORCE_INCREMENT
- 업데이트가 되지 않는 경우에 강제로 version을 +1를 더한다.
- 1:N의 구조의 데이터 인경우는 N에 해당하는 데이터를 추가할때 1에 해당하는 데이터가 version이 안올라기 때문에 Transaction이 보장이 안될수가 있다. 이런 경우에는 강제로 version 을 +1를 더함으로써 해결할수 있다.
2. 비관적 잠금
- 해당하는 컬럼의 row에 lock를 걸고, 다른 transaction이 수정이 못하도록 잠금(lock)을 한다.
@Lock Annotation
- LockModeType.PESSIMISTIC_READ
- Read만 가능, Write은 금지 (Shared Lock)
- 다른 트랙잭션에 Write, Update가 불가능, 트랙잭션 끝나는 것에 대한 dirty를 방지
- 여러 트랙잭션이 여러개의 Lock를 생성을 할수 있다.
- LockModeType.PESSIMISTIC_WRITE
- Read 잠금, Write 가능 (Exclusive Lock)
- PESSIMISTIC_WRITE만 가진 Transacation만 업데이트가 가능하다.
- LockModeType.PESSIMISTIC_FORCE_INCREMENT
- 낙관적잠금, 비관적잠금이 서로 섞여 있을때 Transaction이 보장이 안될수도 있다. version 컬럼을 이용해서 Transaction 을 보장을 할수 있다.
관련내용
- https://stackoverflow.com/questions/33062635/difference-between-lockmodetype-jpa
'Database > JPA' 카테고리의 다른 글
JPA 영속성 컨텍스트 (0) | 2018.09.08 |
---|---|
JPA CascadeType (0) | 2018.09.08 |
@ EnableTransactionManagement Advice Mode PROXY와 ASPECTJ (0) | 2018.06.03 |
Transactional with jpa repository (0) | 2018.05.28 |