동시성(Concurrency)이란?
병행성이라고 불리기도 하는 동시성은 논리적으로 두 개 이상의 task 가 동시에 실행되는 것처럼 보이는 상태를 의미합니다. 이를 구현하기 위해 하나의 작업을 일정 부분만 수행한 후, 다음 작업으로 전환하며 실행합니다. 이 과정에서 문맥 교환이 필요합니다.
동시성 환경에서는 여러 스레드가 동시에 공유 자원(shared resource)을 수정하려 할 때 문제가 발생할 수 있습니다. 이를 동시성 이슈라고 합니다. 먼저, 공유 자원과 임계 영역에 대해 알아보겠습니다.
공유 자원과 임계 영역이란?
공유 자원은 여러 스레드나 프로세스가 동시에 접근할 수 있는 데이터를 의미합니다.
코드 측면에서는 Service 등에 전역 변수가 공유 자원이 될 수 있습니다.
프로세스 메모리 영역은 크게 4가지로 구성되어 있습니다.
- 코드 영역 : 프로그램의 코드
- 데이터 영역 : 전역 변수 저장
- 힙 영역 : 동적으로 할당되는 메모리
- 스택 영역 : 매개변수, 지역 변수 등 임시 데이터
멀티 스레드 환경에서 스택 영역을 제외한 나머지 영역은 공유됩니다. 예를 들면, Service 클래스의 전역 변수는 데이터 영역에 저장되며, 모든 스레드가 공유하기 때문에 공유 자원(shared resource) 에 해당합니다.
데이터베이스 관점에서는 컬럼의 값이 공유 자원이 될 수 있습니다.
상품 재고(stock)을 관리 할 때, 여러 스레드가 동시에 접근을 하게 되면 데이터의 정합성이 깨질 수 있습니다. 이러한 필드는 공유 자원(shared resources)임을 알 수 있습니다.
그리고 이렇게 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역을 임계 영역(critical section) 이라고 합니다.
동시성 이슈
동시성 환경에서 여러 스레드가 공유 자원에 접근하거나 수정할 때 경쟁 상태(race condition) 가 발생하며, 이로 인해 다양한 동시성 문제가 나타날 수 있습니다. 대표적인 동시성 이슈는 다음과 같습니다.
경쟁 상태(race condition)
: 공유 자원에 대해 여러 스레드가 동시에 접근을 시도할 때, 타이밍이나 순서 등이 결과값에 영향을 줄 수 있는 상태이다.
1. Lost Update(write-write conflict)
두 트랜잭션이 동시에 같은 데이터를 수정할 때, 하나의 트랜잭션의 수정사항이 다른 트랜잭션에 의해 덮어쓰여지는 문제입니다.
예를 들어, 사용자 포인트가 1,000p 인 상황에서:
- 스레드 A 가 500p 충전.
- 스레드 B 가 300p 충전.
두 작업이 동시에 실행되면 마지막 작업만 적용되어 결과가 1,300p 가 될 수 있습니다. 다른 충전 작업은 사라지게 됩니다.
2. Dirty Read
아직 커밋되지 않은 트랜잭션의 데이터를 다른 트랜잭션이 읽는 경우 발생하는 문제입니다.
예를 들어, 스레드 A가 사용자 포인트를 1,000p에서 1,500p로 수정 중일 때, 스레드 B가 이를 읽으면 문제가 생깁니다. 만약 스레드 A가 롤백하면 스레드 B는 잘못된 데이터를 기반으로 작업하게 됩니다.
3. Non-Repeatable Read
한 트랜잭션이 같은 데이터를 두 번 읽을 때, 중간에 다른 트랜잭션이 동일한 데이터를 수정해서 결과가 달라지는 문제입니다.
예를 들어,
- 트랜잭션 A가 처음 데이터를 조회해 1,000p 를 확인.
- 다른 트랜잭션 B가 이를 1,800p 로 수정 후 커밋.
- 트랜잭션 A가 다시 데이터를 조회하면 결과가 1,800p 로 바뀝니다.
4. Phantom Read
한 트랜잭션 내에서 동일한 쿼리를 여러 번 수행했을 때, 중간에 다른 트랜잭션이 데이터를 추가하거나 삭제하여 결과가 달라지는 문제가 발생합니다.
예를 들어,
- 트랜잭션 A가 500p 을 충전 후 충전 이력을 조회를 확인.
- 다른 트랜잭션 B가 새로운 사용자에 포인트를 1,500으로 충전.
- 트랜잭션 A가 동일한 조건으로 충전 이력을 조회할 때 새로운 충전 이력이 추가된 것을 볼 수 있습니다.
위와 같은 동시성 이슈를 해결하기 위해 락(Lock), 트랜잭션 격리 수준 등의 기법을 활용할 수 있습니다. 이를 통해 데이터 정합성을 유지하고 안정적인 시스템을 구현할 수 있습니다. 어떻게 동시성 이슈를 해결하는지 차근차근 포스팅 해보겠습니다.
'OperatingSystem' 카테고리의 다른 글
[OS] 멀티프로세스(multi-process)와 멀티스레드(multi-thread)를 비교해보겠습니다. (0) | 2024.12.18 |
---|