본문 바로가기
CS/데이터베이스

동시성 제어하기 - 04. 낙관적 락

by 컴쏘 2023. 6. 7.
728x90

동시성 제어를 위한 가장 보편적인 방법은 락을 통한 줄세우기

→ 비관적 락

  • 락을 통한 동시성 제어는 불필요한 대기 상태를 만듦
  • MySQL에서는 인덱스를 잠그기 때문에 WHERE문 조건에 따라서 불필요한 데이터들이 잠기기도 함

동시성이 빈번하지 않은 쿼리로 인해 다른 쿼리가 대기한다면?

동시성 이슈가 빈번하지 않길 기대하고, 어플리케이션에서 제어한다. → 낙관적 락의 기본 개념

CAS(compare and set)

낙관적 락에서 어떻게 어플리케이션에서 제어하는가?

CAS를 통해 제어한다.

 

예제를 통해 살펴보자.

 

예제)

지난 예제와 다른 점은 버전이 추가되었다는 것이다.

  • 낙관적 락에서는 레코드 하나에 대해서 버전을 매긴다. (버전 관리를 통해 내가 조회했던 버전이 맞는지 확인을 하고 맞다면 업데이트를 하고 그렇지 않다면 업데이트를 하지 않음**)**

첫번째 트랜잭션이 홍길동의 잔고와 버전정보를 읽는다.

첫번째 트랜잭션이 완전히 다 끝나기 전에 두번째 트랜잭션이 중간에 들어온다.(마찬가지로 홍길동의 잔고와 버전정보를 읽음)

→ 지금은 첫번째와 두번째 트랜잭션이 홍길동이 잔고와 버전 정보를 읽은 상태 (읽을 때는 락을 잡지 않기 때문에 대기하지 않음)

첫번째 트랜잭션이 홍길동 잔고에서 100원을 빼고 버전을 업데이트 함(1 → 2) & WHERE 문으로 버전 정보를 조건으로 건다.

따라서 두번째 트랜잭션이 홍길동의 잔고에서 100원을 빼고 업데이트할 때는 버전이 달라지기 때문에 실패한다. (WHERE문 조건에서 레코드를 못 찾기 때문)

낙관적 락 단점

실패에 대한 처리를 직접 구현해야 함

낙관적 락은 충돌이 일어났을 때 한 쪽이 실패를 해버림 (UPDATE가 안됨)

→ 재시도(재시도는 재시도에 대한 실패도 고려를 해야하기 때문에 재시도로 처리를 할 때는 비동기로 처리함) 혹은 알려주기, 버리기 등의 방법으로 선택해서 구현해야 함


2023 KAKAO Tech Campus_BackEnd 필수 과정
DB(MySQL) 강의 정리 내용입니다.
728x90