BackEnd

멀티 스레드 환경에 대한 이해

Raconer 2024. 2. 5. 23:41
728x90

멀티 스레드 환경

대부분 하나의 웹 서버는 여러개의 요청을 동시에 수행할수 있다.
즉. 작성한 코드 한 줄은 동시에 수행 될 수 있다.
그래서 하나의 자원(DB Row, 서버 글로벌 변수 등..)을 두고 여러 개의 연산들이 경합한다.(데이터 정합성을 깨뜨릴 수 있다.)

예) 100원을 출금 하는 요청이 동시에 발생한다면?

이름 잔액
홍길동 1000
  1. 트랜잭션1 READ(홍길동 잔고) > 1000
  2. 트랜잭션2 READ(홍길동 잔고) > 1000
  3. 트랜잭션1 UPDATE(홍길동 잔고 - 100) > 900
  4. 트랜잭션2 UPDATE(홍길동 잔고 - 100) > 900

결과. -200이 되어 800원이 되어야 하지만
트랜잭션2 에서는 1000원으로 읽었기 때문에 900원으로 UPDATE 된다.
그래서 없는돈 100원이 출금되는 잘못된 현상이 발생된다.

동시성

위의 예제와 같은 현상을 동시성 이슈라고 한다.

동시성이 발생 되는 패턴

  1. 공유자원 조회

-> 다른 오퍼레이션 수행
2. 공유자원 갱신

위 패턴 1번과 2번 사이에 다른 오퍼레이션이 수행 되면 동시성 이슈가 발생된다.

동시성 이슈 제어 하는법

  1. 공유자원에 대한 잠금을 획득 하여 줄 세우기

동시성 이슈 제어가 어려운 이유

  1. 로컬에서는 대부분 하나의 스레드로 테스트 한다.
  2. 이슈가 발생하더라도 오류가 발생하지 않는다.
  3. 코드에서 잘 보이지 않는다.
  4. 항상 발생하지 않고 비결정적으로 발생한다.
728x90