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() 함수를 이용해, 임의의 문자열에 대해 잠금을 설정할 수 있다.