1. 낙관적 잠금(Optimisstic Lock)
⇒ 낙관적 잠금은 실무에서 실질적으로 데이터 갱신시 경합이 발생하지 않을 것이라고 낙관적으로 판단하여 잠금을 거는 기법입니다.
예를들어, 회원정보의 변경요청은 거진 회원 당사자에 의해 요청이 발생하기에 동시접근이 발생 할 확률이 낮습니다.
따라서 동시 수정이 이뤄지는 경우를 감지해서 예외를 발생해도 발생 가능성이 낮다고 보는 것으로 잠금(Lock)보다는 충돌감지(Conflict detection)에 가깝습니다.
2. 비관적 잠금(Perssimistic Lock)
⇒ 동일한 데이터를 동시에 수정 할 가능성이 높다는 비관적인 전제로 잠금을 거는 방식입니다.
예를들어, 상품의 재고의 경우 여러명이 같은 상품을 동시에 주문할 수 있기 때문에 데이터 수정에 의한 경합이 발생할 확률이 높다고 비관적으로 보는 것입니다. 이럴 경우 비관적 잠금(Perssimistic Lock)을 통해 예외를 발생시키지 않고 정합성을 보장하는 것이 가능합니다.
다만, 성능적인 측면에서 손실을 감수해야 합니다.
데이터베이스에서 제공하는 베타잠금(Exclusive Lock)을 사용합니다.
3. 암시적 잠금(Implicit Lock)
⇒ 프로그램 코드상에 명시적으로 지정하지 않아도 잠금이 발생하는 것을 의미합니다.
JPA에서는 엔티티에 @Version이 붙은 필드가 존재하거나 @OptimisticLocking 어노테이션이 설정되어 있을 경우 자동적으로 충돌감지를 위한 잠금이 실행됩니다. 그리고 데이터베이스의 경우에는 일반적으로 사용하는 대부분의 데이터베이스가 업데이트, 삭제 쿼리 발생시 암시적으로 해당 로우에 대한 행 배타잠금(Row Exclusive Lock)이 실행됩니다. JPA의 충돌감지가 역할을 할 수 있는 것도 데이터베이스의 암시적 잠금이 있기 때문입니다.
4. 명시적 잠금(Explicit Lock)
⇒ 프로그램을 통해 의도적으로 잠금을 실행하는 것이 명시적 잠금입니다.
JPA에서 엔티티를 조회할 때 LockMode를 지정하거나 select for update 쿼리를 통해 직접 잠금을 지정할 수 있습니다.
5. 사용법
작성중...