Database/JPA

Database Transaction Lock With JPA

BUST 2018. 5. 28. 22:36

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