Database/Mysql

[Real MySQL] 5-1. 트랜잭션과 잠금: 트랜잭션

noahkim_ 2023. 11. 24. 22:38

백은빈, 이성욱 님의 "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