글로벌 락(Global Lock)
FLUSH TABLES WITH READ LOCK
- 모든 테이블의 잠금을 거는것, 주로 mysqldump에서 사용
- 락을 건 세션 외에 다른곳에서 SELECT외의 쿼리는 락이 풀릴시까지 대기한다.
테이블 락(Table Lock)
LOCK TABLES {name} READ;
LOCK TABLES {name} WRITE;
UNLOCK TABLES {name} READ;
UNLOCK TABLES {name} WRITE;
SHOW OPEN TABLES FROM {name}
SHOW STATUS LIKE 'Table%';
SHOW PROCESSLIST;
- 개별 테이블 단위로 락을 획득하고 점유하는 방식
- MyISAM 및 InnoDB 모두 사용 가능하다.
- 테이블 전체를 점유하는 락으로 특별하지 않으면 이용빈도가 낮다.
유저 락(User Lock)
SELECT GET_LOCK('testLock',2);
SELECT IS_FREE_LOCK('testLock');
SELECT RELEASE_LOCK('testLock');
- 내장함수 get_lock을 이용하여 잠금을 사용할 수 있다.
- 데이터베이스의 저장 정보와 관련 없는 문자열을 지정해놓고 점유하는 방식의 락이다.
- 동시에 경쟁하면서 여러작업을 처리할떄 유용하다.
네임 락(Name Lock)
RENAME TABLE a to b, z to y;
- 테이블,뷰와 같은 이름을 변경시 사용되는 잠금이다.
- 명시적으로 제어할수 없고 RENAME과 같은 작업시에 동작하는것이다.
InnoDB 잠금방식
- 낙관적 잠금(Optimistic Lock)
각 트랜잭셔이 동시 변경될 가능성이 희박하다 보고서 별도 잠금 없이 작업을 수행해보고 충돌이 감지되면 ROLLBACK(ERROR)하는 방식
- 비관적 잠금(Pessmistic Lock)
변경하고자 하는 레코드에 잠금을 획득하고 작업을 처리하는 방식
높은 동시성 처리에서 선호하는 방식이다.
InnoDB 잠금 종류
레코드 락(Record lock)
- 점유할 범위의 레코드만 잠그는 방식
- 실제적으로는 레코드가 아닌 인덱스의 레코드를 잠그는점이다.
- 인데긋가 없어도 자동 생성된 클러스트 인덱스를 통해 잠근다.
갭락(Gap Lock)
- 갭락 레코드가 아닌 레코드와 바로 인접한 사이의 간격만 잠그는것을 의미한다.
- 갭락은 개념일뿐 자체적인 기능은 아니다.
넥스트키락(Next Key Lock)
- 레코드락과 갭락을 합쳐놓은 잠금
- 갭락과 넥스트 락은 바이너리 로그에 기록된 쿼리가 슬레이브에서 실행시 마스터와 같은 결과를 만들도록 보장하는것
자동증가락(Auto Increment Lock)
- 자동증가락은 테이블에 하나만 존재하여 복수의 쿼리가 발생하면 다른 쿼리간에 경쟁이 발생한다.
- 아주 짧은 락으로 별도로 획득하고 해제하는 방법은 없다.
Mysql Lock 변경락
세션1
SET LOCK_TIMEOUT 10*1000;
update table set a=1;
- 트랜잭션을 열어놓고 쿼리 수행중이고 커밋은 하지 않은상태
세션2
SET LOCK_TIMEOUT 10*1000;
update table set a=2;
- 세션1이 커밋을 하지 않은상태라서 처리가 되지 않고 대기를 탄다.
세션1
COMMIT;
- 세션1이 커밋을 하자 세션2의 뭐리가 수행될수있고 세션1이 10초안에 처리를 못한다면 세션2의 작업은 드랍된다.
Mysql 조회락
select * from pepople for update
- 조회하는 쿼리에 락을 걸고 commit 될때까지 점유한다.
- commit 되기전까지 다른 세션은 lock wait을 한다.
- select for update 할때 락 획득하지 못하면 얻을때까지 대기한다.