반응형
💋 락 (Lock)
✔ 분류
- MySQL에서 사용되는 락은 크게 스토리지 엔진 레벨과 MySQL 엔진 레벨로 분류
- 스토리지 엔진 레벨의 락
- 스토리지 엔진 간 상호 영향을 미치지 않음.
- MySQL 엔진 레벨의 락
- 모든 스토리지 엔진에 영향을 미침.
- 테이블 데이터 동기화를 위한 테이블 락 이외에도 메타데이터 락, 네임드 락 기능 존재
이번 포스팅에서는 MySQL 엔진 레벨의 락에 대해서 설명할 것이다!
💋 MySQL 엔진의 락 (Lock)
✔ 글로벌 락
- FLUSH TABLES WITH READ LOCK 명령으로 획득
- 영향 범위는 MySQL 서버 전체로, MySQL에서 제공하는 락 중 가장 범위가 크다.
- 실행과 동시에 MySQL 서버에 존재하는 모든 테이블을 닫고 잠금을 건다.
- 한 세션에서 글로벌 락을 획득하면 다른 세선에서는 SELECT를 제외한 대부분의 문장을 실행하지 못하고 대기
- 작업 대상 테이블이나 데이터베이스가 다르더라도 동일하게 영향을 미침
- 웹 서비스용으로 사용되는 서버에서는 가급적 사용하지 않는 것이 좋음.
- 이 명령을 실행하기 위해서는 테이블에 읽기 락을 걸어야 하므로, 먼저 테이블에 실행중이던 모든 종류의 쿼리가 완료되어야 함
- InnoDB 스토리지 엔진의 사용이 일반화되면서, 트랜잭션이 지원되어 일관된 데이터 상태를 위해서 모든 데이터 변경 작업을 멈출 필요가 없어지면서 글로벌 락의 사용이 줄어들었다.
✔ 테이블 락
- 개별 테이블 단위로 설정되는 락
- 명시적, 혹은 묵시적으로 특정 테이블 락을 설정할 수 있다.
- 명시적
- LOCK TABLES table_name [ READ | WRITE] 명령으로 락 획득, UNLOCK TABLES 명령으로 락 반납
- 애플리케이션에서 거의 사용할 필요 없으며, 글로벌 락과 동일하게 웹 작업에서 상당한 영향을 미침.
- 묵시적
- 쿼리가 실행되는 동안 자동 획득, 쿼리가 완료된 후 자동 해제
- MyISAM이나 MEMORY 테이블에 데이터를 변경하는 쿼리를 실행하면 발생
- MySQL 서버가 데이터가 변경되는 테이블에 잠금을 설정하고 데이터를 변경한 후, 즉시 잠금을 해제하는 형태로 사용
- 참고: InnoDB 테이블은 스토리지 엔진 차원에서 레코드 기반의 잠금을 제공하기 때문에, 단순 데이터 변경 쿼리(대부분의 DML)에서는 테이블 락이 설정되지 않고, 스키마를 변경하는 쿼리(DDL)의 경우에만 영향을 미침.
- 명시적
✔ 네임드 락
- GET_LOCK() 함수를 통해 임의의 문자열에 대해 잠금 설정
- 대상이 테이블, 레코드, 데이터베이스 객체가 아니라, 단순히 사용자가 지정한 문자열에 대해 획득하고 반납하는 잠금
- 많은 레코드에 대해 복잡한 조건으로 레코드를 변경하는 트랜잭션에서 유용
- 자주 사용되지 않음.
✔ 메타데이터 락
- 데이터베이스 테이블, 뷰의 이름이나 구조를 변경하는 경우에 획득하는 락
- RENAME TABLE table_a TO table_b와 같이 테이블 이름을 변경하는 경우 자동으로 획득 (명시적 획득 불가)
💋 참고자료
- Real MySQL 8.0 1편
반응형