여러 스레드가 동시에 하나의 애그리거트를 수정하면 애그리거트의 일관성이 깨지게 된다.
먼저 애그리거트를 조회한 스레드가 애그리거트의 사용이 끝날 때까지 다른 스레드는 해당 애그리거트를 수정할 수 없는 방식
JPA를 사용할 때 비관적 락을 사용하는 방법 - @Lock(LockModeType.PESSIMISTIC_WRITE)
을 사용한다.
@Lock(LockModeType.PESSIMISTIC_WRITE)
Optional<Member> findById(Stirng id);
비관적 락은 교착 상태에 빠질 수 있다.
이를 해결하기 위해서 다음과 같이 대기 시간을 지정해야한다.
@Lock(LockModeType.PESSIMISTIC_WRITE)
@QueryHints({
@QueryHint(name ="javax.persistence.lock.timeout", value ="2000")
})
Optional<Member> findById(Stirng id);
엔티티에 @Version을 사용한 필드를 지정한다.
엔티티를 조회하고 수정하는 과정에서 버전이 맞지 않게 되면 예외가 발생한다.
이 때문에 트랜잭션이 롤백된다.