July
27th,
2021
MySQL에서 사용되는 잠금은 스토리지 엔진 레벨과 MySQL 엔진 레벨로 나눠볼 수 있다.
MySQL 엔진 레벨의 잠금은 모든 스토리지 엔진에 영향을 미치게 되지만, 스토리지 엔진 레벨의 잠금은 스토리지 엔진간 상호 영향을 미치지 않는다.
MySQL 엔진 레벨에서는 테이블 데이터 동기화를 위한 테이블 락 말고도 유저 락, 테이블 명에 대한 잠금을 위한 네임 락 등등을 제공한다.
4.2.1 글로벌 락
FLUSH TABLES WITH READ LOCK
명령(실행과 동시에 MySQL 서버에 존재하는 모든 테이블에 잠금을 건다)으로만 획득할 수 있으며, MySQL에서 제공하는 잠금 가운데 가장 범위가 크다.- 한 세션에서 글로벌 락을 획득하면, 다른 세션에서 SELECT를 제외한 대부분의 DDL, DML 문장 수행시 글로벌 락이 해제될 때 까지 대기 상태로 남는다.
- MySQL 서버 전체에 영향을 미친다.
- MyISAM 혹은 MEMORY 테이블에 대해 mysqldump로 일괄된 백업을 받아야 할 때 글로벌 락을 사용해야 한다.
4.2.2 테이블 락(TABLE LOCK)
- 개별 테이블 단위로 설정되는 잠금이다.
LOCK TABLES table_name [READ | WRITE]
명령어를 통해 특정 테이블의 락을 획득할 수 있다.UNLOCK TABLES
를 통해 락을 반납(해제)한다.- 전체 어플리케이션 서버에 영향을 끼칠 수 있기 때문에 특별한 상황이 아닌 이상 사용하지 않는다.
- 묵시적 테이블 락 : MyISAM, MEMORY 테이블에 데이터를 변경하는 쿼리 실행시 잠금을 설정하고, 데이터를 변경한 후 즉시 잠금을 해제(자동해제)된다.
4.2.3 유저 락(USER LOCK)
GET_LOCK()
함수를 이용해 임의로 잠금을 설정할 수 있다.- 유저 락은 단순히 사용자가 진정한 문자열에 대해 락을 획득하고 반납한다.
- 사용 예시 : 데이터베이스 서버 1대에 5대의 웹서버가 접속해 서비스를 하고 있는 상황에서, 5대의 웹 서버가 어떤 정보를 동기화 해야할 경우
- 또한, 많은 레코드를 한 번에 변경하는 트랜잭션에서도 사용할 수 있다.(데드락 방지)
4.2.4 네임 락
- 데이터베이스 객체(테이블, 뷰 등)의 이름을 변경하는 경우 획득하는 잠금이다.
RENAME TABLE tab_a TO tab_b
와 같이 테이블 이름을 변경하는 명령어 수행시 자동으로 획득한다.(명시적으로 획득할 수 있는 방법은 없다)- 변경 전 테이블과 변경 후 테이블 모두 한꺼번에 잠금을 설정한다.
참고자료 : Real MySQL - 4.2 MySQL엔진의 잠금