본문 바로가기
스프링 부트

[스프링] 동시성 문제를 처리하는 2가지 방법

by illlilillil 2022. 10. 11.

스프링에서 발생할 수 있는 동시성 문제에 대한 해결 방법 3가지를 알아보자

 

목차

  1. 낙관적 락
  2. 비관적 락

낙관적 락

낙관적 락이란 자원에 락을 걸지 않고 동시성 문제가 발생했을때 처리하는 방법이다.

트랜잭션이 충돌하지 않는다고 가정하고, 만약 충돌이 된다면 롤백을 진행시킨다.

DB단에서 동시성 처리하지 않고 제어권을 어플리케이션이 가지고 있다는 특징이 있다.

 

언제 사용할까?

충돌이 잘 일어나지 않는 트랜잭션 -> 락을 걸지 않기 때문에 성능이 좋다.

 

단점은 없나?

롤백이 발생할때 개발자가 수동으로 하나하나 처리해주어야 한다.

  1. Alice가 id 1번을 조회
  2. Bob이 id 1번을 조회
  3. Bob이 id 1번을 업데이트 후 커밋
  4. Alice이 id 1번을 업데이트 시도했으나 이미 version이 달라졌기에 업데이트 쿼리가 실패

 

비관적 락

비관적 락은 충돌이 발생할 것을 가정하고 Repeatabel Read or Serializable 정도의 격리성을 가진다.

비관적 락은 트랜잭션이 시작할때 Shared Lock 또는 Exclusive Lock을 걸고 시작한다.

따라서 다른 공유 락은 배타 락을 획득할때까지 기다려야 한다.

Shared Lock과 Exclusive Lock 이란?
Shared Lock(공유 락)은 데이터 읽기 위해 획득하는 락으로, 수정, 삭제가 불가능한 락이다.
Exclusive Lock(배타 락)은 데이터 쓰기 위해 획득하는 락으로, 로우에 대해 락을 획득하면 다른 공유 락은 접근할 수 없다.

  1. Alice가 id 1번을 조회 공유 락 획득
  2. Bob이 id 1번을 조회
  3. Bob이 id 1번을 업데이트는 하지 못하고 커밋되어 공유 락을 획득할때까지 기다린다.
  4. Alice의 트랜잭션이 끝난 후 Bob은 공유 락을 획득해 트랜잭션을 수행할 수 있다.

 

스프링에서 사용법

원하는 메서드에 적용하기만 하면 for update 쿼리가 수행된다

@Lock(LockModeType.PESSIMITIC.WRITE)

 

 

댓글