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

동시성 제어하기 - 01. 멀티 스레드 환경에 대한 이해

by 컴쏘 2023. 6. 7.

대부분 하나의 웹 서버는 여러 개의 요청을 동시에 수행할 수 있다.

작성한 코드 한 줄은 동시에 수행 될 수 있다.

하나의 자원을 두고 여러 개의 연산들이 경합을 하기 때문에 데이터 정합성을 깨뜨릴 수 있다.

 

예제를 통해 위의 상황을 이해해보자.

 

예제) 

상황 : 100원을 출금하는 요청이 동시에 발생 

100원을 출금하는 요청이 동시에 발생

첫번째 트랜잭션이 홍길동의 잔고를 읽고 출금 금액을 확인 → 잔고가 넉넉한지를 확인 → 출금금액 만큼 기존의 잔고에서 빼주어서 홍길동의 잔고를 UPDATE

첫번째 트랜잭션이 홍길동의 잔고를 읽고 출금 금액을 확인하는 과정 바로 후에 두번째 트랜잭션이 홍길동의 잔고를 읽는 상황이 발생했다고 가정

  • 첫번째 트랜잭션은 그대로 100원을 빼고 900원을 업데이트함
  • 두번째 트랜잭션은 잔고가 1000원으로 확인되었기 때문에 마찬가지로 100원을 제외한 900원을 업데이트함

사실 200원이 출금이 되었으므로 최종 금액은 800원이 되어야하지만, 결과는 900원이되는 이슈가 발생한다.

데이터베이스에 동시성 이슈가 발생하는 일반적인 패턴

  1. 공유자원 조회
  2. 공유자원 갱신

1번과 2번 사이에 다른 오퍼레이션이 수행되면 동시성 이슈가 발생하는 여지가 생김

동시성 이슈를 어떻게 제어하는가?

여러가지 방법이 있지만, 가장 대표적인 방법은 공유자원(앞선 예제에서는 잔액)에 대한 잠금을 획득하여 줄 세우기이다.

동시다발적으로 발생했던 하나의 트랜잭션
잠금을 획득해서 순차적으로 처리하는 방식

동시다발적으로 발생했던 하나의 트랜잭션을 잠금을 획득해서 순차적으로 처리하는 방식으로 변경한다. 

동시성 이슈가 어려운 이유

  1. 로컬에서는 대부분 하나의 스레드로 테스트
  2. 이슈가 발생하더라도 오류가 발생하지 않는다.
  3. 코드에서 잘 보이지 않는다.
  4. 항상 발생하지 않고 비결정적(일반적인 패턴이 아닌 랜덤하게 발생)으로 발생한다

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