백은빈, 이성욱 님의 "Real MySQL" 책을 정리한 포스팅 입니다.
1. 트랜잭션
- 하나의 논리적인 작업 단위로 실행되는 일련의 연산
- DML 문을 하나의 트랜잭션으로 묶어 실행할 수 있음
특징
항목 | 설명 |
Atomicity (원자성) |
All or Nothing
- 트랜잭션 내 모든 작업이 전부 수행되거나 전혀 수행되지 않음. - 오류 발생 시 전체 롤백. → Partial Update 방지, 데이터 정합성 보장 |
Consistency (일관성) |
트랜잭션 전후로 데이터베이스의 무결성 제약조건이 항상 유지됨.
예: 외래 키, 고유 제약조건 등이 깨지지 않음 |
Isolation (격리성) |
트랜잭션이 다른 트랜잭션의 영향을 받지 않고 독립적으로 수행됨.
→ 동시성 문제가 없도록 보장 |
Durability (지속성) | 커밋된 트랜잭션의 결과는 영구적으로 저장됨. |
주의사항
항목 | 설명 |
트랜잭션 범위 최소화 | 트랜잭션이 길어질수록 - 데이터 락 지속 시간 증가 → 성능 저하 발생 - 커넥션 점유 시간 증가 → 트랜잭션 시작 후 빠르게 커밋 또는 롤백 필요 (DB 커넥션은 제한된 자원) |
외부 통신 포함 금지 |
트랜잭션 내 외부 시스템 호출 시 장애 발생 가능 (예: 네트워크 지연, 타임아웃)
→ DB 락 유지, 성능 저하 및 리소스 고갈 유발 |
MySQL
Engine
- InnoDB 엔진 지원 O
- MyISAM, MEMORY 엔진 지원 X
2. Lock
- 동시성을 제어하기 위한 기능
- 여러 트랜잭션이 동일한 데이터에 동시에 접근하는 것을 방지
MySQL 엔진 레벨
- 모든 스토리지 엔진에 영향 미침
구분 | 적용 대상 | 설명 |
글로벌 락 | 전체 DB | DB 전체 잠금 (다른 세션 대기, 단 SELECT 제외) |
백업 락 | 메타데이터 / 구조 | 백업 중 DDL, 인증정보 변경 등 제한 (레플리카 동기화 주의) |
테이블 락 | 개별 테이블 | 테이블 단위 READ / WRITE 잠금 |
네임드 락 | 문자열 (Key 기반) | 사용자 정의 키로 잠금 설정 (DB 객체 무관) |
메타데이터 락 | DB 객체 (테이블 등) | 테이블 이름/구조 변경 시 자동 획득 (DDL 실행 시) |
명령어
더보기
글로벌 락
FLUSH TABLES WITH READ LOCK;
UNLOCK TABLES;
테이블 락
LOCK TABLES table_name [ READ | WRITE ];
UNLOCK TABLES table_name;
네임드 락
SELECT GET_LOCK('mylock', 2);
SELECT RELEASE_LOCK('mylock');
SELECT IS_FREE_LOCK('mylock');
스토리지 엔진 레벨
- 각 스토리지 엔진이 고유하게 관리 (스토리지 엔진 간 독립적으로 동작)
- InnoDB: Row Lock
- MyISAM: Table Lock
3. InnoDB 스토리지 엔진 잠금
- 인덱스 레코드 기반 (모든 락은 인덱스를 기준으로 설정됨)
- 인덱스가 없다면, 테이블 전체를 잠금
종류
종류 | 설명 |
레코드 락 | 특정 레코드(행)에만 잠금. 기본키 또는 유니크 인덱스가 있는 경우에만 적용됨 |
갭 락 | 레코드 사이 "공간(갭)"에 대한 잠금. 신규 삽입 방지 목적 |
넥스트 키 락 | 레코드 락 + 갭 락의 조합. - 해당 레코드와 주변 갭 모두 잠금 → 읽기 일관성과 팬텀 리드 방지 REPEATABLE READ 격리 수준에서 기본 동작 |
자동증가 락 | AUTO_INCREMENT 컬럼의 순서를 보장하기 위한 락. (테이블 수준 락) 트랜잭션과는 무관하게 동작 (롤백해도 증가된 값은 복원 안됨) |
명령어
더보기
레코드 락
SELECT ... FOR UPDATE
갭 락
SELECT * FROM users WHERE id BETWEEN 10 AND 20 FOR UPDATE;
레코드 수준의 잠금 및 해제 확인
- performance_schema.data_locks
- performance_schema.data_lock_waits
'Database > Mysql' 카테고리의 다른 글
[Real MySQL] 8-3. 인덱스: 알고리즘 - B-Tree Index (0) | 2023.11.25 |
---|---|
[Real MySQL] 8-2. 인덱스 (0) | 2023.11.25 |
[Real MySQL] 4-4. 아키텍쳐: MySQL 로그 파일 (1) | 2023.11.24 |
[Real MySQL] 4-2. 아키텍쳐: InnoDB 스토리지 엔진 아키텍쳐 (0) | 2023.11.24 |
[Real MySQL] 4-1. 아키텍쳐: MySQL 엔진 아키텍쳐 (0) | 2023.11.23 |