비관적 Lock, 낙관적 Lock

짱구·2023년 1월 19일
0

database

목록 보기
5/7

비관적 Lock

  • 동시성 이슈가 발생할 것이라 생각을 해서 미리 줄을 세우게 만드는 방법

  • 단점

    • 락을 통한 동시성 제어는 불필요한 대기 상태를 만듬
    • MySQL에서 인덱스를 잠구기 때문에 where문 조건에 따라 불필요한 데이터까지 잠길 수 있다.
    • 동시성이 빈번하지 않은 쿼리로 잠금을 잠가버려 다른 쿼리가 대기해야함

낙관적 Lock

  • 동시성 이슈가 빈번하지 않을거라 기대하고 어플리케이션에서 제어하는 방법
    • CAS(compare and set)을 통해 제어
      ※ update를 하기전에 비교를 하고 값이 일치하면 수정하는 방법

CAS 예제

홍길동의 계좌로 서로 다른 두 개의 트랜잭션이 동시에 일어났다.

트랜잭션 1이 살짝 먼저 홍길동의 잔고를 읽어 왔고, 트랜잭션 2도 똑같은 홍길동의 잔고를 읽어 왔다.

트랜잭션 1이 먼저 update 쿼리를 날리고 where 구문에서 버전의 정보가 1인경우 update를 하게 만들었다.

버전이 1이기에 홍길동의 잔고는 100이 줄었고 버전은 2가 되었다.

트랜잭션 2도 똑같은 update쿼리를 날렸지만 where구문 버전이 다르기에 쿼리는 실패하게 된다.


낙관적 Lock의 단점

  • 실패에 대한 후처리를 직접 구현해야함
    • 다시 버전을 올린후 update (재시도 로직도 다시 짜야함)
    • 그냥 에러 메시지 등등...
profile
코드를 거의 아트의 경지로 끌어올려서 내가 코드고 코드가 나인 물아일체의 경지

0개의 댓글