728x90
반응형
SMALL
학습내용
- 동시성 문제
- 대표적인 동시성 이슈
- DB 및 Java 코드에서 사례 실습
학습정리
1. 동시성 문제란?
- 여러 트랜잭션이나 프로세스가 동시에 데이터에 접근하거나 작업을 수행하는 상황을 의미
- 주로 업데이트, 읽기때 발생함
- 동시성 문제를 제대로 관리하지 않으면, 데이터 정합성 문제가 발생 할 수 있음
- 예시) 수량이 5개인 상품에 대해서 A,B가 동시에 3개씩 주문하면 실제 재고가 -1 되는 현상
2. 대표적인 동시성 이슈 (트랜잭션 격리 수준 관련 문제)
- Dirty Read
- 한 트랜잭션이 커밋 되지 않은 데이터를 다른 트랜잭션에서 읽는 상황을 의미
- 예시
- 트랜잭션 A: 계좌 잔액을 100에서 200으로 업데이트(하지만 아직 커밋하지 않음).
- 트랜잭션 B: 트랜잭션 A가 수정한 200을 읽음.
- 트랜잭션 A: 롤백(업데이트 취소) → 잔액은 다시 100이지만, 트랜잭션 B는 잘못된 데이터를 읽음.
- 해결 방법
- 데이터베이스 격리 수전을 READ COMMITTED 이상으로 설정
- Non-Repeatable Read
- 한 트랜잭션 내에서 같은 데이터를 두 번 읽을 때, 다른 트랜잭션에 의해 데이터가 수정되거나 삭제되어 결과가 달라지는 상황.
- 예시
- 트랜잭션 A: 고객의 잔액을 100으로 조회.
- 트랜잭션 B: 잔액을 150으로 수정하고 커밋.
- 트랜잭션 A: 같은 데이터를 다시 조회 → 값이 150으로 변경됨. → 처음 조회한 데이터와 달라 비일관성 발생.
- 해결 방법
- 데이터베이스 격리 수준을 REPEATABLE READ 이상으로 설정
DirtyRead, Non-Repeatable Read 는 데이터베이스가 기본적으로 보장함
MySQL DB기본격리수준(REPEATABLE READ)
- 데이터베이스 격리 수준을 REPEATABLE READ 이상으로 설정
- Phantom Read
- 한 트랜잭션이 같은 조건으로 데이터를 조회했을 때, 다른 트랜잭션에 의해 새로운 데이터가 삽입되거나 삭제되어 결과에 변화가 생기는 상황.
- 예시
- 트랜잭션 A: WHERE salary > 5000 조건으로 직원 리스트 조회 → 5명.
- 트랜잭션 B: 새로운 직원(급여 6000)을 삽입하고 커밋.
- 트랜잭션 A: 같은 조건으로 다시 조회 → 직원 리스트에 6명. → 데이터의 팬텀(유령)처럼 새로운 행이 추가됨.
- Lost Update
- 두 개 이상의 트랜잭션이 동시에 같은 데이터를 수정할 때, 나중에 실행된 트랜잭션이 먼저 수행된 트랜잭션의 변경 사항을 덮어쓰는 상황.
- 예시
- 트랜잭션 A: 상품 재고를 10 → 8로 업데이트.
- 트랜잭션 B: 같은 상품 재고를 10 → 9로 업데이트.
- 트랜잭션 A와 B가 커밋 → B의 변경 사항으로 인해 A의 업데이트는 사라짐.
- 해결 방안
- Optimistic Locking(낙관적 잠금) 또는 Pessimistic Locking(비관적 잠금)사용
격리 수준 | Dirty Read | Non-Repeatable Read | Phantom Read | Lost Update |
---|---|---|---|---|
Read Uncommitted | ✘ | ✘ | ✘ | ✘ |
Read Committed | ✔ | ✘ | ✘ | ✘ |
Repeatable Read | ✔ | ✔ | ✘ | ✘ |
Serializable | ✔ | ✔ | ✔ | ✔ |
참고사항
- @Transactional 격리레벨 설정하기 위해 아래 패키지의 트랜잭셔널사용
- import org.springframework.transaction.annotation.Transactional;
ps. 금일에는 대표적인 동시성이슈(트랜잭션 격리 수준) 관련해서 고의적으로 발생 시키면서 어떻게 문제가 생기는지 확인해보면서 DB와 JAVA 코드로 실습코드를 진행했습니다.
처리하는 방법에 대해서는 다음 시간부터 진행.
728x90
반응형
LIST
'TIL' 카테고리의 다른 글
6_3.DB 락 메커니즘 이해와 실습 (0) | 2025.02.02 |
---|---|
6_2.트랜잭션 격리 수준 이해 및 실습 (0) | 2025.02.01 |
5_5.MyBatis 활용 (0) | 2025.01.24 |
5_4.EXPLAIN과 MyBatis (1) | 2025.01.23 |
5_3.배치 쿼리 활용 (0) | 2025.01.23 |