잠금
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 문제가 발생하지 않는다.