동시성 제어를 위한 가장 보편적인 방법은 락을 통한 줄세우기
→ 비관적 락
- 락을 통한 동시성 제어는 불필요한 대기 상태를 만듦
- MySQL에서는 인덱스를 잠그기 때문에 WHERE문 조건에 따라서 불필요한 데이터들이 잠기기도 함
동시성이 빈번하지 않은 쿼리로 인해 다른 쿼리가 대기한다면?
동시성 이슈가 빈번하지 않길 기대하고, 어플리케이션에서 제어한다. → 낙관적 락의 기본 개념
CAS(compare and set)
낙관적 락에서 어떻게 어플리케이션에서 제어하는가?
→ CAS를 통해 제어한다.
예제를 통해 살펴보자.
예제)
지난 예제와 다른 점은 버전이 추가되었다는 것이다.
- 낙관적 락에서는 레코드 하나에 대해서 버전을 매긴다. (버전 관리를 통해 내가 조회했던 버전이 맞는지 확인을 하고 맞다면 업데이트를 하고 그렇지 않다면 업데이트를 하지 않음**)**
첫번째 트랜잭션이 홍길동의 잔고와 버전정보를 읽는다.
첫번째 트랜잭션이 완전히 다 끝나기 전에 두번째 트랜잭션이 중간에 들어온다.(마찬가지로 홍길동의 잔고와 버전정보를 읽음)
→ 지금은 첫번째와 두번째 트랜잭션이 홍길동이 잔고와 버전 정보를 읽은 상태 (읽을 때는 락을 잡지 않기 때문에 대기하지 않음)
첫번째 트랜잭션이 홍길동 잔고에서 100원을 빼고 버전을 업데이트 함(1 → 2) & WHERE 문으로 버전 정보를 조건으로 건다.
따라서 두번째 트랜잭션이 홍길동의 잔고에서 100원을 빼고 업데이트할 때는 버전이 달라지기 때문에 실패한다. (WHERE문 조건에서 레코드를 못 찾기 때문)
낙관적 락 단점
실패에 대한 처리를 직접 구현해야 함
낙관적 락은 충돌이 일어났을 때 한 쪽이 실패를 해버림 (UPDATE가 안됨)
→ 재시도(재시도는 재시도에 대한 실패도 고려를 해야하기 때문에 재시도로 처리를 할 때는 비동기로 처리함) 혹은 알려주기, 버리기 등의 방법으로 선택해서 구현해야 함
2023 KAKAO Tech Campus_BackEnd 필수 과정
DB(MySQL) 강의 정리 내용입니다.
'🔍 CS > 데이터베이스' 카테고리의 다른 글
11/24 - TIL : NoSQL과 Redis (0) | 2024.11.24 |
---|---|
동시성 제어하기 - 07. 읽기와 쓰기의 트레이드 오프 (0) | 2023.06.07 |
동시성 제어하기 - 02. 쓰기락과 읽기락 - 이론 (0) | 2023.06.07 |
동시성 제어하기 - 01. 멀티 스레드 환경에 대한 이해 (0) | 2023.06.07 |
데이터 정합성 보장을 위한 트랜잭션 이해하기 - 04. 트랜잭션 격리레벨 (0) | 2023.06.07 |