잠금과 트랜잭션은 서로 비슷한 개념 같지만 다르다.
- 잠금
- 동시성을 제어하기 위한 기능
- 여러 커넥션에서 동시에 동일한 자원을 요청할 경우 순서대로 한 시점에는 하나의 커넥션만 변경할 수 있게 해주는 역할
- 트랜잭션
- 데이터의 정합성을 보장하기 위한 기능
- 격리 수준은 하나의 트랜잭션 내에서 또는 여러 트랜잭션 간의 작업 내용을 어떻게 공유하고 차단할 것인지를 결정하는 레벨
- 범위를 최소화해야 한다. 네트워크 작업이 있는 경우 반드시 트랜잭션에서 배제해야 한다.
MySQL에서 사용되는 잠금은 크게 스토리지 엔진 레벨, MySQL 엔진 레벨로 나눌 수 있다.
(https://kkang-joo.tistory.com/163)
- MySQL 엔진은 스토리지 엔진을 제외한 나머지 부분
- MySQL 엔진 레벨의 잠금은 스토리지 엔진에 영향을 미친다
- 스토리지 엔진 레벨 잠금은 스토리지 엔진 간 상호 영향을 미치지는 않는다.
MySQL 엔진 잠금
글로벌 락
- FLUSH TABLES WITH LOCK
- 글로벌 락이 걸리면 다른 세션에서 select를 제외한 대부분의 DDL, DML 문장의 실행이 락이 해제될 때까지 대기해야 한다.
테이블 락
- 개별 테이블 단위로 설정되는 잠금
- LOCK TABLES table_name [ READ | WRITE ]
네임드 락
- 임의의 문자열에 대해 잠금을 설정
- GET_LOCK()
메타 데이터 락
- 데이터베이스 객체의 이름이나 구조를 변경하는 경우에 획득하는 잠금
InnoDB 스토리지 엔진 잠금
레코드 기반의 잠금 방식
레코드 락 - 레코드 자체만을 잠그는 것, InnoDB는 레코드 자체가 아니라 인덱스의 레코드를 잠근다
인덱스가 하나도 없는 테이블이더라도 내부적으로 자동 생성된 클러스터 인덱스를 이용해 잠금을 설정
갭 락 - 레코드 자체가 아니라 레코드와 바로 인접한 레코드 사이의 간격만을 잠그는 것
넥스트 키 락 - 레코드 락 + 갭 락
자동 증가 락 - AUTO_INCREMENT 락
트랜잭션과 관계없이 값을 가져오는 순간에만 걸렸다가 즉시 해제된다.