ssuperjun 님의 블로그
[스터디3] MySQL 스터디 발표자료 - deprecated 본문
책 제목: 데이터베이스 시스템 개론과 MySQL 실습
병행 제어
병행 제어 문제 상황: 여러 트랜잭션이 동시에 실행될 때 트랜잭션 간 간섭으로 예기치 못한 결과 생성
발생 가능한 문제 예시: 갱신 분실, 모순성, 연쇄 복귀
갱신 분실 모순성


연쇄 복귀

- 트랜잭션b가 commit을 완료한 뒤 트랜잭션a가 rollback을 시도하면 트랜잭션b도 rollback해야 일관성이 유지되지만
- 트랜잭션b는 이미 commit 완료 상태이므로 rollback 불가능
- => 트랜잭션a만 rollback 수행해 일관성 문제 발생
- 병행 제어 기법의 목적: 트랜잭션 스케줄의 직렬 가능성 보장
- 트랜잭션 스케줄: 트랜잭션 연산들의 실행 순서 지정
- 직렬 스케줄: 트랜잭션 T1이 실행을 모두 마친 후에만 트랜잭션 T2가 실행 -> 일관성 보장
- 비직렬 스케줄: 트랜잭션이 병행 수행하는 스케줄. 인터리빙(끼워넣기) 허용
- 직렬 가능 스케줄: 비직렬 스케줄이지만, 정확한 결과를 만드는 스케줄
- 2단계 로킹 규약을 따르면 스케줄의 직렬 가능성이 보장됨
- 확장 단계: 트랜잭션은 새로운 lock연산만 실행할 수 있고 unlock 연산은 수행할 수 없는 단계
- 축소 단계: 트랜잭션은 unlock 연산만 실행할 수 있고 unlock 연산을 수행하면 lock 연산은 더 이상 실행할 수 없는 단계

- 다중 버전 동시성 제어(MVCC): 데이터를 변경할 때 이전 데이터를 '언두 로그'에 남겨두어, 락을 걸지 않고도 다른 트랜잭션이 이전 버전의 데이터를 읽을 수 있음
- 트랜잭션 격리수준: 여러 트랜잭션이 동시에 처리될 때, 트랜잭션끼리 얼마나 서로 고립되어 있는지를 나타내는 것
1) READ UNCOMMITTED: 다른 트랜잭션에서 커밋되지 않은 내용도 참조할 수 있음
- 트랜잭션 A에서 데이터를 변경하는 중에 B에서 해당 데이터를 접근하고, A가 다시 롤백하면 B는 중간에 수정한 데이터로 읽음


- Dirty Read: 어떤 트랜잭션의 작업이 완료되지 않았는데도, 다른 트랜잭션에서 볼 수 있는 부정합 문제
2) READ COMMITTED: 다른 트랜잭션에서 커밋된 내용만 참조할 수 있음
- NON-REPEATABLE READ 부정합 문제가 발생 가능. 하나의 트랜잭션 내에서 똑같은 select 를 수행했을 경우 항상 같은 결과를 반환해야 한다는 repeatable read 정합성에 어긋남

3) REPEATABLE READ: 트랜잭션에 진입하기 이전에 커밋된 내용만 참조할 수 있음
3-1. MVCC(변경 전의 데이터는 언두 로그에 저장하기 때문에 한 레코드에 여러 버전의 데이터 존재)를 이용해 한 트랜잭션 내에서 동일한 결과를 보장하지만, 새로운 레코드가 추가되는 경우에 부정합 발생

3-2. Phantom Read: 다른 트랜젹션에서 수행한 작업에 의해 레코드가 안보였다 보였다 하는 현상

3-3. MySQL은 갭 락이 존재해 Phantom Read가 거의 발생하지 않음

3-4. 유일하게 아래 경우에만 MySQL도 Phantom Read 발생(사용자 B가 처음 SELECT 때 아무 잠금 없이 조회한 경우)


4) SERIALIZABLE: 트랜잭션이 시작하면 락을 걸어 다른 트랜잭션이 접근하지 못하게 함(성능 매우 떨어짐)
격리 수준 정리
| 격리 수준 | Dirty Read | Non-Repeatable Read | Phantom Read |
| READ UNCOMMITTED | O | O | O |
| READ COMMITTED | X | O | O |
| REPEATABLE READ | X | X | O |
| SERIALIZABLE | X | X | X |
사용처
- Read Uncommitted: 정합성보다 속도가 중요한 단순 통계 수집
- Read Committed 또는 Repeatable Read(MySQL 기본값): 일반적인 웹 서비스
- Serializable 또는 매우 엄격한 락: 돈이 오가는 금융권
궁금증
1. 실무에서의 MySQL DB는 기본값인 Repeatable Read를 그대로 사용하는지, 아니면 상황에 따라 격리 수준을 낮추거나(예: Read Committed) 높여서 사용하는 경우가 있는지
2. 실무에서 트랜잭션 동시성 문제나 데드락을 마주했을 때 어떻게 해결하는지
'인턴' 카테고리의 다른 글
| [스터디3] MySQL 스터디 발표자료 최종 (0) | 2026.03.04 |
|---|---|
| [스터디3] MySQL 스터디 발표 질문대비 (0) | 2026.03.04 |
| [장애 이력 자동 작성 도구3] Redis OOM 장애 상황 연출 (0) | 2026.02.27 |
| [장애 이력 자동 작성 도구2] 2차 정리 (0) | 2026.02.26 |
| Redis Port 다운 증상에 대한 원인 분석 구현 - deprecated (0) | 2026.02.24 |