비관적 락과 낙관적 락

무지성개발자·2023년 10월 20일
0

낙관적 락

낙관적 락은 자원을 읽을 때 lock을 걸지 않고, 자원을 변경하고 변경했다고 명시하는 방법이다. 보통 version으로 관리한다.

예를 들어 두 개의 스레드에서 동시에 같은 레코드를 변경하는 경우

  • 스레드 1 : select 결과에서 version 1을 얻음.
  • 스레드 2 : select 결과에서 version 1을 얻음.
  • 스레드 1 : update 후 version을 2로 올림.
  • 스레드 2 : update 하려고 하니 버전이 안맞음.
    • 다른 스레드에서 변경했다고 인지(충돌)하고 update안함.

비관적 락

낙관적 락과 반대로 자원을 읽을 때 부터 lock을 걸어, 다른 스레드에서 같은 자원에 접근을 못 하도록 막는 것.

  • 공유 락 : 읽기 락이라고도 함.
    • select for share키워드를 사용하여 공유 락을 획득.
    • 다른 스레드가 변경을 위해 같은 레코드를 읽으려고 하면 대기 상태가 됨.
  • 베타 락 : 쓰기 락이라고도 함.
    • select for update키워드를 사용하여 베타 락을 획득.
    • 단순 select가 아니면 다른 스레드에서 접근을 못하고 대기 상태가 됨.

언제 사용 할까?

  • 낙관적 락
    • 읽기 요청이 비교적 많을 때.
    • 실제로 충돌이 잦지 않는다고 판단되는 곳.
  • 비관적 락
    • 읽기 요청이 비교적 많지 않을 때.
    • 실제로 충돌이 잦아 데이터의 무결성을 반드시 지켜줘야 하는 곳.

한 줄평 : 동시에 수정을 하는일이 빈번하게 일어나는가를 기준으로 사용하면 될 것 같다.

profile
no-intelli 개발자 입니다. 그래도 intellij는 씁니다.

0개의 댓글