컬럼으로 version 을 두고, 변경이 일어나는 시점에 조회했던 version 과 현재 버전이 일치하는지 확인하고,일치해야만 데이터를 Update 하는 락을 말한다. 주로 수정이 일어날 때 사용되며
version 어노테이션과 네이티브 쿼리에 @Lock 어노테이션에 lock type 을 optimistic 으로 설정하면 된다.
@Lock(value = LockModeType.OPTIMISTIC)
@Query("select s from Stock s where s.id =:id")
Stock findByIdWithOptimisticLock(Long id);
우선 충돌이 빈번하지 않게 발생한다는 가정하에 코드를 구현 함. version 이 업데이트 되고, 업데이트 된 버전이 과 다르면 업데이트를 하지 않게 하는건 어플리케이션 단에서 DB 락을 걸지 않고도 할 수 있는 방법이라 동시성 처리률이 높다는 장점이 있음
빈번하게 동시성이 발생하면 충돌이 날때마다 에러 핸들링을 해줘야함
옵티메스틱 락 익셉셥이 발생함
exception 이 발생했을 때 thread 를 잠시 슬립 시키고, 이후에 재진행을 하도록 while
구문이 필요함.
public void decrease(Long id, Long quantity) throws InterruptedException {
while (true) {
try {
optimisticLockStockService.decrease(id, quantity);
break;
} catch (Exception e) {
Thread.sleep(50);
}
}
}
데이터에 실제로 락을 걸어서 정합성을 맞추는 것임. s-lock 과 x-lock 을 적절히 사용해서 거는것임