낙관적 락(Optimistic Lock)

**트랜잭션 대부분 충돌이 발생하지 않는다고 가정**하고 어플리케이션에 락을 거는 것

읽는 시점에 락을 사용하지 않기 때문에 데이터를 수정하는 시점에 다른 사용자에 의해 변경됐는지 여부 확인 필요

이렇게 낙관적 락은 트랜잭션을 커밋하기 전까지는 트랜잭션의 충돌 여부를 알 수 없다.

@Version

JPA가 제공하는 낙관적 락을 사용하려면 **@Version을 사용하여 버전 관리를 추가**하면 된다.

@Version을 붙이면 엔티티가 수정될 때 자동으로 버전이 하나씩 증가하며 수정할 때 조회 시점과 버전이 다르면

OptimisticLockException 예외가 발생


낙관적 락 모드

OPTIMISTIC(Read)

@Version을 포함하는 모든 엔티티에 대하여 낙관적 락을 얻음

OPTIMISTIC_FORCE_INCREMENT (Write)

낙관적 락을 사용하면서 버전 정보를 강제로 증가 시킨다


비관적 락(Pessimistic Lock)

자원에 대한 동시 요청이 발생하여 일관성에 문제가 생길 것이라고 비관적으로 생각하고 우선 락을 거는 것