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

https://www.letmecompile.com/mysql-innodb-lock-deadlock/

Print Friendly and PDF Posted by JJ*
: