2022.09.10 - [DB] - [DB] 트랜잭션 Transaction 이란?
2022.09.19 - [DB] - [DB] Transaction - Atomicity 원자성 이해하기
참고한 강의
경쟁상태 (Race Condition)
- 같은 데이터에 동시 접근 시 생기는 문제
- 여러 클라이언트가 같은 데이터에 접근할 때 문제 발생
- 해결방법
- 트랜잭션 격리 (isolation)
- 트랜잭션을 서로 격리해서 다른 트랜잭션이 영향을 주지 못하게 함
- 가장 쉬운 방법은 트랜잭션을 순서대로 실행
- 동시 접근 문제 아예 없음
- 하지만 한 번에 한개 트랜잭션만 처리하므로 성능 (처리량) 저하 가능
- 다양한 격리 수준 지원
- Read Uncommitted :사실상 사용하지 않음
- Read Committed
- Repeatable Read
- Serializable
동시성 관련 다양한 문제들
1. 커밋되지 않은 데이터 읽기 = dirty read
- 3번에서 cnt = 2여야하나 커밋이 되지않아 다른 데이터가 나감
2. 커밋되지 않은 데이터 덮어쓰기 = dirty write
- 커밋되지않은 데이터가 덮어써짐
🚨Read Committed 격리 레벨
- 커밋된 데이터만 읽기
- 커밋된 값과 트랜잭션 진행 중인 값을 따로 보관
- 커밋된 데이터만 덮어쓰기
- 행 단위 잠금 사용 (Lock)
- 같은 데이터를 수정한 트랜잭션이 끝날 때까지 대기
3. 읽는 동안 데이터 변경 1 = read skew
- 1번의 값 A를 읽었으면 5번 값 B일때도 처음 데이터를 읽어야 하나 그사이에 데이터가 변경되어 다른 값이 나옴.
🚨Repeatable Read
- 트랜잭션 동안 같은 데이터를 읽게 함
- 읽는 시점의 version을 같게 함.
- db에는 두가지 version을 저장함 (읽을때 해당하는 버전의 값을 읽음)
4. 변경유실 = Lost Update
- 잠금을 사용하였으나 기댓값과 다른 값이 나옴. (변경되는 과정에서 유실됨)
🚨처리방법
- 원자적 연산 사용
- DB가 지원하는 원자적 연산 사용
- 동시 수정 요청에 대해 DB가 순차 처리
- 예 : update article set readcnt = readcnt+1 where id = 1
- 명시적인 잠금
👉조회할 때 수정할 행을 미리 잠금
- CAS (Compare And Set)
👉수정할 때 값이 같은지 비교
5. 읽는 동안 데이터 변경2
- 두 트랜잭션이 서로 다른 데이터를 업데이트 했기때문에 생기는 문제
🚨Serializable 격리
- 인덱스 잠금이나 조건 기반 잠금 등 사용
- 3번이 먼저 인덱스 잠금을 하여 중간에 업데이트를 못하게 함.
[정리]
🚩 동시성은 초보자가 놓치기 쉬운 문제
👉 동시성 문제와 격리 수준을 이해하면 문제 발생을 줄일 수 있음
🚩 잠금 시간은 최소화
👉 잠금 시간이 길어지면 성능 (처리량) 저하
🚩 동시성 문제를 다룰때는 다음을 알면 좋음
👉 사용하는 db의 기본 격리 레벨
👉 DB의 격리 레벨 동작 방식 (DB마다 동작 방식이 다를 수 있음)
'😺Data Base > 😻 SQLD' 카테고리의 다른 글
[SQL] SQL 종류 - DDL / Data Type (0) | 2022.10.31 |
---|---|
[SQL] JOIN (0) | 2022.09.20 |
[DB] Transaction - Atomicity 원자성 이해하기 (0) | 2022.09.19 |
[DB] Index (0) | 2022.09.17 |
[RDBMS] 관계형 데이터 모델링 2 (0) | 2022.09.16 |