MySQL에는 동시성 제어를 위한 여러 가지 종류의 잠금이 있다. 잠금은 여러 커넥션에서 동시에 동일한 자원을 요청한 경우 순서대로 한 시점에는 하나의 커넥션만 변경할 수 있게 해주는 역할을 한다. MySQL에서 잠금은 크게 MySQL 엔진 레벨의 잠금과 스토리지 엔진 레벨의 잠금으로 나뉘는데, 이번 글은 MySQL 엔진 레벨의 잠금에 관한 글이다. MySQL 엔진 레벨의 잠금은 모든 스토리지 엔진에 영향을 주지만, 스토리지 엔진 레벨의 잠금은 스토리지 엔진 간 상호 영향을 주진 않는다.
글로벌 락은 MySQL에서 제공하는 잠금 중 가장 범위가 크다. 글로벌 락은 MySQL 서버 전체를 잠그며, 글로벌 락을 획득한 세션을 제외한 다른 모든 세션의 대부분의 DDL/DML 문장을 대기시킨다. 글로벌 락은 작업 대상 테이블이나 데이터베이스가 다르더라도 동일하게 영향을 준다. 주로 MyISAM이나 MEMORY 테이블에 대해 일관된 백업을 받을때 사용한다.
그러나, MySQL 8.0부터 기본 스토리지 엔진이 InnoDB가 채택되며 백업 락(Backup Lock)이 도입됐다. 백업 락이 도입된 이유는 다른 스토리지 엔진과 달리 InnoDB는 트랜잭션을 지원하기 때문에 일관된 백업을 위해 글로벌 락을 사용하지 않아도 되기 때문이다. 백업 락은 일반적인 테이블의 데이터 변경을 허용하기 때문에 글로벌 락에 비해 조금 더 가볍다는 장점이 있다.
테이블 락은 테이블 데이터 동기화를 위한 잠금이며, 개별 테이블 단위로 설정된다. 테이블 락은 MyISAM이나 MEMORY 테이블의 데이터를 변경할 때 사용된다. 단, InnoDB 테이블은 레코드 기반의 잠금을 제공하기 때문에 InnoDB 테이블의 데이터를 변경할 때 테이블 락이 필요하지 않다. 다만, DDL로 테이블의 스키마로 변경하는 경우 InnoDB 테이블 또한 테이블 락이 필요하다.
네임드 락은 특정 테이블이나 레코드와 같은 데이터베이스 객체에 대한 잠금이 아니라, 임의의 문자열에 대한 잠금이다. 네임드 락은 단순히 사용자가 지정한 문자열을 잠그고 해제한다. 일반적인 상황에서 주로 사용되진 않고, 분산 환경에서 동기화를 처리할 때 사용할 수 있다. 이에 관한 자세한 설명은 Haon님의 블로그를 참고해보자.
메타데이터 락은 데이터베이스 객체(테이블, 스키마, 스토어드 프로그램, 테이블스페이스 등)의 이름이나 구조, 즉 메타데이터에 대한 잠금이다. 데이터베이스 객체의 RENAME TABLE과 같이 메타데이터를 변경할 때 자동으로 획득되고 해제된다.