Real MySQL 8.0 — 트랜잭션과 잠금 완전정복
Real MySQL 8.0 1권을 읽으며 정리한 트랜잭션과 잠금 챕터 학습 노트. MySQL 아키텍처부터 InnoDB 내부 구조, 락 종류, 데드락, 격리 수준까지 — 면접에서 당당하게 말할 수 있을 정도로 깊게 파봤어요.
Real MySQL 8.0을 드디어 읽다.....
ORM만 쓰던 저한테 MySQL 내부는 그냥 블랙박스였거든요. INSERT 날리면 들어가고, SELECT 하면 나오고. 그게 전부인 줄 알았죠.
이 글은 Real MySQL 8.0 1권에서 트랜잭션과 잠금 챕터에 내용입니다. 나중에 제가 다시 꺼내볼 레퍼런스이기도 하고, 같이 공부하는 분들께도 도움이 됐으면 해서 올려요.
MySQL 아키텍처 — 다른 DB와 다른 이유
MySQL이 Oracle이나 PostgreSQL과 결정적으로 다른 점이 하나 있다. 바로 2계층 구조다.
┌─────────────────────────────────────┐│ MySQL Server Layer ││ SQL 파싱 · 쿼리 최적화 · 캐시 ││ 접속 관리 · 권한 체크 │├─────────────────────────────────────┤│ Storage Engine Layer ││ ┌──────────┐ ┌────────┐ ┌───────┐ ││ │ InnoDB │ │ MyISAM │ │Memory │ ││ └──────────┘ └────────┘ └───────┘ │└──────────────────── ─────────────────┘MySQL Server는 SQL을 받아서 어떻게 처리할지 결정하는 두뇌다. 스토리지 엔진은 실제로 데이터를 디스크에 읽고 쓰는 손발이다. 이 둘이 분리되어 있어서 테이블마다 다른 엔진을 쓸 수도 있다.
-- 테이블별로 다른 엔진 사용 가능CREATE TABLE logs (id INT, msg TEXT) ENGINE = MyISAM;CREATE TABLE orders (id INT, amount INT) ENGINE = InnoDB;
-- 현재 엔진 확인SHOW TABLE STATUS WHERE Name = 'orders'\G반면 Oracle은 모든 게 하나로 통합된 모놀리식 구조다. PostgreSQL은 단일 엔진이지만 익스텐션으로 기능을 확장한다. MySQL의 분리 구조는 유연하지만, 트랜잭션 같은 중요한 기능이 엔진 레벨에서 구현된다는 걸 이해해야 한다. 트랜잭션은 MyISAM은 지원 안 하고, InnoDB만 지원한다.
InnoDB 내부 구조 — 진짜 이해해야 할 것들
페이지(Page): 읽기/쓰기의 최소 단위
InnoDB는 데이터를 페이지(Page) 단위로 디스크에서 읽고 메모리에 올린다. 기본 크기는 16KB다.
중요한 건 MySQL이 행(Row) 하나만 따로 읽어올 수 없다는 거예요. 무조건 그 행이 속한 페이지 전체(16KB)를 읽어온다.
┌──────────────────┐ ┌──────────────────┐│ Data Page 1 │ │ Index Page A ││ id=1 ~ id=100 │ │ alice@ → Page1 ││ (16KB) │ │ bob@ → Page1 │├──────────────────┤ ├──────────────────┤│ Data Page 2 │ │ Index Page B ││ id=101 ~ id=200 │ │ carol@ → Page2 ││ (16KB) │ │ dave@ → Page2 │└──────────────────┘ └──────────────────┘ 테이블 데 이터 페이지 보조 인덱스 페이지테이블 데이터뿐 아니라 인덱스도 별도의 페이지로 구성된다. 보조 인덱스 페이지라는 개념은 체인지 버퍼를 이해할 때 핵심이다.
SHOW VARIABLES LIKE 'innodb_page_size';-- 결과: 16384 (= 16KB)버퍼 풀(Buffer Pool): InnoDB의 캐시
버퍼 풀은 InnoDB가 사용하는 메모리 공간이다. 디스크에서 읽어온 페이지를 여기 올려두고 재사용한다.
디스크 읽기 과정: 쿼리 요청 → 버퍼 풀에 해당 페이지 있으면? → 바로 반환 (빠름) ↓ 없으면 디스크에서 페이지 읽어옴 → 버퍼 풀에 올림 → 반환 (느림)버퍼 풀 크기가 클수록 디스크 I/O가 줄어 성능이 좋아진다. 운영 서버에서는 전체 메모리의 50~80%를 버퍼 풀에 할당하는 게 일반적이다.
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';체인지 버퍼(Change Buffer): 쓰기 성능의 비밀
체인지 버퍼는 보조 인덱스 페이지에 대한 변경사항을 버퍼링하는 특수한 메모리 구조다.