낙관적 락

컬럼으로 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 을 적절히 사용해서 거는것임