대부분 하나의 웹 서버는 여러 개의 요청을 동시에 수행할 수 있다.
→ 작성한 코드 한 줄은 동시에 수행 될 수 있다.
→ 하나의 자원을 두고 여러 개의 연산들이 경합을 하기 때문에 데이터 정합성을 깨뜨릴 수 있다.
예제를 통해 위의 상황을 이해해보자.
예제)
상황 : 100원을 출금하는 요청이 동시에 발생
첫번째 트랜잭션이 홍길동의 잔고를 읽고 출금 금액을 확인 → 잔고가 넉넉한지를 확인 → 출금금액 만큼 기존의 잔고에서 빼주어서 홍길동의 잔고를 UPDATE
첫번째 트랜잭션이 홍길동의 잔고를 읽고 출금 금액을 확인하는 과정 바로 후에 두번째 트랜잭션이 홍길동의 잔고를 읽는 상황이 발생했다고 가정
- 첫번째 트랜잭션은 그대로 100원을 빼고 900원을 업데이트함
- 두번째 트랜잭션은 잔고가 1000원으로 확인되었기 때문에 마찬가지로 100원을 제외한 900원을 업데이트함
사실 200원이 출금이 되었으므로 최종 금액은 800원이 되어야하지만, 결과는 900원이되는 이슈가 발생한다.
데이터베이스에 동시성 이슈가 발생하는 일반적인 패턴
- 공유자원 조회
- 공유자원 갱신
1번과 2번 사이에 다른 오퍼레이션이 수행되면 동시성 이슈가 발생하는 여지가 생김
동시성 이슈를 어떻게 제어하는가?
여러가지 방법이 있지만, 가장 대표적인 방법은 공유자원(앞선 예제에서는 잔액)에 대한 잠금을 획득하여 줄 세우기이다.
동시다발적으로 발생했던 하나의 트랜잭션을 잠금을 획득해서 순차적으로 처리하는 방식으로 변경한다.
동시성 이슈가 어려운 이유
- 로컬에서는 대부분 하나의 스레드로 테스트
- 이슈가 발생하더라도 오류가 발생하지 않는다.
- 코드에서 잘 보이지 않는다.
- 항상 발생하지 않고 비결정적(일반적인 패턴이 아닌 랜덤하게 발생)으로 발생한다
2023 KAKAO Tech Campus_BackEnd 필수 과정
DB(MySQL) 강의 정리 내용입니다.
'CS > 데이터베이스' 카테고리의 다른 글
동시성 제어하기 - 04. 낙관적 락 (0) | 2023.06.07 |
---|---|
동시성 제어하기 - 02. 쓰기락과 읽기락 - 이론 (0) | 2023.06.07 |
데이터 정합성 보장을 위한 트랜잭션 이해하기 - 04. 트랜잭션 격리레벨 (0) | 2023.06.07 |
데이터 정합성 보장을 위한 트랜잭션 이해하기 - 02. 트랜잭션 A, C, I, D (0) | 2023.06.07 |
데이터 정합성 보장을 위한 트랜잭션 이해하기 - 01. 트랜잭션이 없는 세상은 (0) | 2023.06.06 |