8.10.4 메타 데이터 잠금(Metadata Locking)
MySQL은 메타 데이터의 잠금을 사용하여 객체 (테이블, 트리거 등)에 대한 액세스를 관리합니다. 메타 데이터의 잠금은 데이터의 일관성을 보장하기 위해 사용되지만, 약간의 오버 헤드가 쿼리 볼륨이 증가하면 그것도 커집니다. 여러 쿼리가 같은 개체에 액세스를 시도 할 많을수록 메타 데이터의 충돌이 증가합니다.
메타 데이터의 잠금은 테이블 정의 캐시의 대체가 아닌 상호 배타적 잠금 및 잠금은 LOCK_open
상호 배타 락과 다릅니다. 다음의 설명에서는 메타 데이터의 락 메커니즘에 대한 정보를 제공합니다.
트랜잭션의 시리얼 라이저 빌리티를 확보하기 위해 서버는 다른 세션에서 완료되지 않은 명시 적 또는 암시 적으로 시작된 트랜잭션에서 사용되는 테이블에 세션 데이터 정의 언어 (DDL) 문 를 실행하는 것을 허용해서는 안됩니다. 서버는 트랜잭션에서 사용되는 테이블에서 메타 데이터 잠금을 획득하고 트랜잭션이 끝날 때까지 그 잠금 해제를 연기함으로써이를 실현합니다. 테이블에 메타 데이터 잠금은 테이블의 구조에 변화를 방해합니다. 이 잠금 방식은 세션의 트랜잭션에서 사용되는 테이블은 트랜잭션이 끝날 때까지 다른 세션에 의해 DDL 문에서 사용할 수 없다는 문제가 있습니다.
이 원칙은 트랜잭션 테이블뿐만 아니라 비 트랜잭션 테이블에도 적용됩니다. 세션이 트랜잭션 테이블 t
과 비 트랜잭션 테이블 nt
를 다음과 같이 사용되는 트랜잭션을 시작합니다.
START TRANSACTION; SELECT * FROM t; SELECT * FROM nt;
서버는 트랜잭션이 끝날 때까지 t
과 nt
모두에 대한 메타 데이터 잠금을 유지합니다. 다른 세션이 하나의 테이블에 대해 DDL 또는 기입 해 락 조작을 시도, 그것은 트랜잭션이 끝날 때 메타 데이터 잠금이 해제 될 때까지 블록됩니다. 예를 들어, 두 번째 세션은 이들 중 하나를 시도하면 차단됩니다.
DROP TABLE t; ALTER TABLE t ...; DROP TABLE nt; ALTER TABLE nt ...; LOCK TABLE t ... WRITE;
서버가 문법적으로이지만 실행에 실패하는 문 메타 데이터 잠금을 획득 한 경우 잠금을 조기에 해제하지 않습니다. 실패한 명령문이 바이너리 로그에 기록되고 자물쇠로 로그 일관성이 보호되므로 잠금 해제는 아직 트랜잭션이 끝날 때까지 연기됩니다.
자동 커밋 모드에서는 각 문이 사실상 전체 트랜잭션이기 때문에 그 문에 획득 된 메타 데이터 잠금은 문이 끝날 때까지 밖에 유지되지 않습니다.
PREPARE
문 중에 획득 된 메타 데이터 잠금은 준비가 다중 문 트랜잭션 내에서 수행되는 경우에도 문이 준비되면 해제됩니다.
MySQL 5.5 이전 버전에서는 트랜잭션이 문에서 사용되는 테이블의 메타 데이터 잠금과 동등한 잠금을 획득 한 경우, 문이 끝날 때 잠금을 해제하고있었습니다. 이 방법은 활성 트랜잭션에서 다른 세션에서 사용되는 테이블에 대해 DDL 문이 실행 된 경우 문은 잘못된 순서로 바이너리 로그에 기록 될 수 있다는 단점이있었습니다 .