4.2 Mysql 엔진의 잠금
소개
Mysql 에서 사용되는 잠금은 크게 스토리지 엔진 레벨과 Mysql 엔진 레벨로 나눠볼 수 있다. Mysql 엔진은 Mysql 서버에서 스토리지 엔진을 제외한 나머지 부분으로 이해하면 되는데, Mysql 엔진 레빌의 잠금은 모든 스토리지 엔진에 영향을 미치게 되지만 스토리지 엔진 레벨의 잠금은 스토리지 엔진 간 상호 영향을 미치지는 않는다.
4.2.1 글로벌락
글로벌락은 "FLUSH TABLES WITH READ LOCK" 명령으로만 획들할 수 있으며, 잠금 가운데 범위가 가장 크다. SELECT 를 제외한 DDL문장이나 DML 문장을 실행하는 경우 글로벌 락이 해제될 때까지 해당 문장이 대기로 남는다.
4.2.2 테이블락 (TABKE LOCK)
개별 테이블 단위로 설정되는 잠금이며, 명시적 또는 묵시적으로 특정 테이블의 락을 획득할수 있다.
명시적으로 "LOCK TABLES table_name [READ/WRITE]" / "UNLOCL TABLES" 사용할 수 있고, 묵시적은 쿼리가 실행되는 동안 자동적으로 획득됐다가 쿼리가 완료후 자동해제 된다. InnoDB 테이블에도 테이블락이 설정되지만 대부분의 데이터변경(DML)쿼리에서는 무시되고 스키마를 변경하는쿼리(DDL)의 경우에만 영향을 미친다.
4.2.3 유저락(USER LOCK)
GET_LOCK() 함수를 이용해 임의로 잠금을 설정할 수 있다. 유저락은 단순히 사용자가 지정한 문자열에 대해 획득하고 반납하는 잠금이다. 유저락은 자주 사용되지는 않는다. 데이터베이스 서버 1대에 5대의 웹서버가 접속해서 서비스를 하고 있는 상황에서 5대의 웹서버가 어떤 정보를 동기화해야하는 요건처럼 여러 클라이언트가 상호 동기화를 처리해야할 때 데이터베이스 유저락을 이용하면 쉽게 해결할 수 있다.
-- // "mylock"이라는 문자열에 대해 잠금을 획득한다.
-- // 이미 잠금이 사용중이면 2초 동안만 대기한다.
mysql> SELECT GET_LOCK('mylock', 2);
--// "mylock"이라는 문자열에 대해 잠금이 설정되어 있는지 확인하다.
mysql> SELECT IS_FREE_LOCK('mylock')
--// "mylock"이라는 문자열에 대해 획득했던 잠금을 반납한다.
mysql> SELECT RELEASE_LOCK('mylock');
--// 3개 함수 모두 정상적으로 락을 획득하거나 해제한 경우 1을 아니면 null 이나 0을 반환한다.
4.2.4 네임락
데이터베이스 객체의 이름을 변경하는 경우 획득하는 잠금이다. 명시적으로 획득/해제 하는것으 아니도 자동으로 획득하는 잠금이다.
--// 배치프로그램에서 별도의 임시 테이블(rank_new)에 서비스용 랭킹 데이터를 생성
--// 랭킹 배치가 완료되면 현재 서비스용 랭킹 테이블(rank)을 rank_backup으로 백업하고
--// 새로 만들어진 랭킹 테이블(rank_new)을 서비스용으로 대체하고자 하는경우
mysql> RENAME TABLE rank TO rank_bankup, rank_new TO rank;
위와 같이 한의 RENAME TABLE 명령문에 두개의 RENAME 작업을 한꺼번에 실행하면 실제 애플리케이션에서는 "TABLE not fount 'rank'" 상황이 발생하지 않고 적용하는 것이 가능하다. 하지만 문장을 2개로 나눠진행하면 아주 짧지만 오류가 발생할 수 있다.