MySQL에서 사용되는 잠금은 스토리지 엔진 레벨과 MySQL 엔진 레벨로 나눌 수 있다. 사실 MySQL엔진 레벨은 스토리지 엔진을 제외한 나머지 부분으로 이해해도 된다.

MySQL 엔진 레벨의 잠금은 모든 스토리지 엔진에 영향을 미치지만, 스토리지 엔진 레벨의 잠금은 스토리지 엔진 간 상호 영향을 미치지 않는다.

MySQL엔진 레벨에서는 테이블 동기화를 위한 테이블 락 외에도, 테이블의 구조를 잠그는 메타데이터 락, 그리고 사용자 필요에 맞게 사용할 수 있는 네임드 락(Named Lock)이라는 기능도 있다.

글로벌 락

글로벌 락은 FLUSH TABLES WITH READ LOCK 명령으로 획득할 수 있다. MySQL에서 얻을 수 있는 락 중에 가장 범위가 크다. 일단 한 세션에서 글로벌 락을 획득하면 다른 세션에서는 SELECT 를 제외한 대부분의 DDL, DML문장은 글로벌 락이 해제될때까지 실행 시 대기 상태가 된다.

글로벌 락이 영향을 미치는 범위는 MySQL 서버 전체이다. 작업 대상 테이블이나 DB가 달라도 영향을 미친다.

MySQL 서버가 업그레이드 되면서 더 가벼운 글로벌 락의 필요성이 생겼다. 그래서 8.0부터는 백업 락이란게 도입되었음. 백업락은

등의 작업은 막지만, 일반적인 테이블 데이터 변경은 허용한다.

테이블 락

개별 테이블 단위로 설정되는 잠금이다. 명시적, 혹은 묵시적으로 특정 테이블의 락을 획득할 수 있다. 명시적으로는 LOCK TABLES table_name [ READ | WRITE ] 명령으로 특정 테이블의 락을 획득할 수 있다.

명시적으로 획득한 잠금은 UNLOCK TABLES 명령으로 잠금을 반납할 수 있다. 사실 이 명시적인 테이블락도 특별한 상황이 아니면 운영중인 애플리케이션에서는 거의 쓸 일이 없다.

묵시적 테이블 락은 InnoDB테이블의 경우 엔진이 레코드 기반의 락을 제공하기 때문에 단순 데이터 변경 쿼리로 인해 묵시적 락이 설정되지는 않는다. 더 정확히는, InnoDB에서도 테이블 락이 사용되기 ㄴ하지만 DML에서는 무시된다. 오직 DDL에서만 영향을 미친다.

네임드 락

네임드 락(Named Lock)은 GET_LOCK() 함수를 이용해, 임의의 문자열에 대해 잠금을 설정할 수 있다.