Notice
Recent Posts
Recent Comments
Link
«   2026/06   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

ssuperjun 님의 블로그

[스터디3] MySQL 스터디 발표자료 - deprecated 본문

인턴

[스터디3] MySQL 스터디 발표자료 - deprecated

ssuperjun 2026. 2. 28. 19:49

책 제목: 데이터베이스 시스템 개론과 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-1


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

3-2

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

3-3

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

3-4

 

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. 실무에서 트랜잭션 동시성 문제나 데드락을 마주했을 때 어떻게 해결하는지