잠금과 트랜잰션 격리 수준

hs·2025년 11월 2일

잠금

MySQL 엔진 레벨

  • 글로벌 락
    • 데이터베이스 서버 전체에 대한 잠금
    • 데이터베이스 백업 작업 등
  • 테이블 락
    • 테이블에 대한 잠금
    • 테이블 구조 변경 (DDL)
  • 네임드 락
    • 사용자가 지정한 문자열에 대한 잠금
    • 여러 서버에 분산된 애플리케이션 간의 동기화
  • 메타데이터 락
    • 테이터베이스 객체(테이블, 뷰)의 이름이나 구조를 변경하는 경우 획득

InnoDB 엔진 레벨

  • 레코드 락
    • 인덱스 레코드에 대한 잠금
    • 인덱스가 없는 경우 자동 생성된 클러스터 인덱스를 이용
  • 갭 락
    • 레코드와 인접한 레코드 사이의 간격을 잠금
    • 레코드 사이 간격에 새로운 레코드가 생성되는 것을 제어
  • 넥스트 키 락
    • 레코드 락과 갭 락의 조합
    • 레코드와 레코드 앞의 갭을 함께 잠금
  • 자동 증가 락
    • AUTO_INCREMENT 에 대한 잠금
    • 트랜잭션과 관계없이 AUTO_INCREMENT 값을 가져오는 순간 락이 걸렸다가 해제된다.

인덱스 기반

  • 레코드를 찾기 위해 검색한 인덱스의 모든 레코드에 대해 잠금 설정
  • 인덱스가 없으면 모든 레코드에 대해 잠금 설정

격리 수준

READ UNCOMMITTED

  • 데이터 정합성 문제로 사용 x
  • Dirty Read: 다른 트랜잭션이 커밋하지 않은 변경 사항을 읽는 것

READ COMMITTED

  • 오라클의 기본 격리 수준
  • 언두 로그에 백업된 데이터를 조회
  • NON-REPEATABLE READ 부정합 문제가 발생할 수 있다.
    • 트랜잭션 내에서 쿼리문의 조회 결과가 변경되는 것

REPEATABLE READ

  • InnoDB 스토리지 엔진의 기본 격리 수준
  • NON-REPEATABLE READ 문제 해결
  • 언두 로그에서 트랜잭션 아이디가 해당 트랜잭션 아이디 보다 작은 데이터 조회
  • PHATOM READ 현상 발생 → 갭 락과 넥스트 키 락으로 방지

SERIALRIZABLE

  • 가장 엄격한 격리 수준
  • PHATOM READ 문제가 발생하지 않는다.
profile
sh

0개의 댓글