MySQL 잠금
[MySQL 운영]/MySQL basic 2021. 1. 29. 15:12 |1. 글로벌락
: 한 세션에서 글로벌락을 획득하면, 다른 세션에서 SELECT를 제외한 DDL, DML 문장을 실행하는 경우 글로벌락이 해제될 때까지 대기상태로 남는다.
- FLUSH TABLES WITH READ LOCK 명령으로 획득
- MySQL 서버 전체에 존재하는 모든 테이블에 잠금을 건다.
- mysqldump로 일관된 백업을 받아야 할 때 사용해야 한다.
- FLUSH TABLES WITH READ LOCK 은 테이블에 읽기잠금을 걸기 전에 먼저 테이블을 플러쉬 해야 하기 때문에 테이블에 실행되고 있는 모든 종류의 쿼리가 완료되어야만 테이블을 플러시하고 잠금을 걸 수 있다.
- FLUSH TABLES WITH READ LOCK 명령이 실행되기 전에 쓰기잠금을 걸고 있는 SQL이 실행되고 있었거나, SELECT 쿼리가 장시간 실행되고 있을 때는 해당 쿼리들이 종료될때까지 기다려야 한다.
2. 테이블락
: 테이블 단위로 설정되는 잠금이며, 명시적 또는 묵시적으로 획득할 수 있다.
- 명시적으로 획득시 "LOCK TALES 테이블명 [READ | WRITE]" 하고, "UNLOCK TABLES" 명령으로 잠금을 해제할 수 있다.
- 묵시적인 테이블 락은 MyISAM이나 MEMORY 테이블에 데이터를 변경하는 쿼리를 실행하면 자동으로 획득하고 완료되면 자동 해제된다.
- InnoDB는 row 기반의 Lock 을 제공하므로, DML(데이터변경)시에는 묵시적인 테이블락이 걸리지 않고, DDL(스키마변경)시에 걸린다.
3. 유저락
: 사용자가 지정한 문자열에 대해 획득하고 반납하는 잠금으로, GET_LOCK() 함수를 이용한다.
- 많은 레코드를 한번에 변경하거나(데드락 방지), 여러 클라이언트가 상호 동기화를 처리해야 할 때 주로 사용한다.
- 사용법
> SELECT GET_LOCK('문자열',초단위); '문자열' 에 대해 잠금을 획득하고, 이미 잠금이 사용중이라면 지정한 초만큼 대기한다.
> SELECT IS_FREE_LOCK('문자열'); '문자열'에 대해 잠금이 걸려있는지 확인한다.
> SELECT RELEASE_LOCK('문자열'); '문자열'에 대해 획득한 잠금을 해제한다.
>> 위 함수 모두 SELECT 결과가 정상 획득/해제한 경우에는 1, 아니면 NULL 또는 0을 반환한다.
4. 네임락
: 객체명을 변경(ALTER TABLE / RENAME)하는 경우 획득하는 잠금으로, 묵시적으로만 (자동으로만) 획득할 수 있다.
- RENAME TABLE 'a' TO 'b' 로 테이블 명을 변경하는 경우, 원본이름과 변경될이름 모두 한꺼번에 잠금을 설정한다.
참고
realmysql
'[MySQL 운영] > MySQL basic' 카테고리의 다른 글
InoDB 잠금 (2) record lock, gap lock, Next Key Lock, Insert Intention Lock, Auto Inc Lock (0) | 2021.01.29 |
---|---|
InoDB 잠금 (1) S락, X락, IS락, IX락 (1) | 2021.01.29 |
Transaction isolation level (트랜잭션 격리수준) (0) | 2021.01.29 |
InnoDB Storage Engine 특성 및 구조 (0) | 2021.01.29 |
MySQL Replication 구조 (0) | 2021.01.29 |
MySQL Query cache (~5.7) (0) | 2021.01.29 |
MySQL 스레딩 구조 (0) | 2021.01.29 |
MySQL Architecture (0) | 2021.01.29 |
MySQL Memory (서버단위/세션단위) (0) | 2021.01.28 |