철학과 학생의 개발자 도전기
Lock과 MVCC 본문
1. Lock
- 읽기 혹은 쓰기 잠금을 통해 다중 트랜잭션의 상호 간섭을 방지한다.
낙관적 동시성 제어
- 사용자들이 같은 데이터를 동시에 수정하지 않을 것이라고 가정
- 데이터 읽는 시점에 Lock을 걸지 않고, 수정 시점에 값이 변경되었는지 검사
- Q. 동시에 수정된다면?: 마지막 커밋만 적용하기 등 전략 설정 필요
비관적 동시성 제어
- 사용자들이 같은 데이터를 동시에 수정할 것이라고 가정
- 데이터를 읽는 시점에 Lock을 걸고, 트랜잭션이 완료될 때 까지 유지
- 공유락: 다른 공유락을 허락함 -> 읽기 잠금으로 사용
- 베타락: 다른 모든 락을 허락하지 않음 -> 쓰기 잠금으로 사용
2. MVCC
- Multi Version Concurrency Control (다중 버전 동시성 제어)
- 동시 접근을 허용하는 데이터베이스에서 동시성을 제어하는 방법
동작 과정
- 사용자는 데이터 접근 시점의 snapshot을 읽는다.
- 데이터 수정 시 이전 버전의 데이터는 UNDO 영역에 기록된다.
- 트랜잭션 롤백 시 UNDO 영역의 데이터를 불러온다.
- 트랜잭션 격리 수준에 맞는 영역의 데이터에 접근할 수 있다.
- 데이터 변경 내용은 REDO 영역에도 기록된다.
- 버퍼와 디스크 간의 일관성 문제를 해결할 수 있다.
- DB 서버가 비정상적으로 종료된 경우에 필요하다.
- 사례 1. 커밋되었지만 디스크에 저장되지 않은 데이터
- 사례 2. 롤백되었지만 디스크에 저장된 데이터
- 이를 통해 트랜잭션 격리와 데이터 일관성을 보장할 수 있다.
장점
- 데이터를 읽을 때, 다른 사용자의 수정에 영향을 받지 않는다.
- 락이 필요없어서 속도가 빠르다.
단점
- 사용하지 않는 이전 버전의 데이터를 정리해야 한다.
- 데이터 버전의 충돌을 애플리케이션이 해결해야 한다.
- UNDO 영역 생성 및 관리 등의 오버헤드가 발생한다.