Mysql 엔진 잠금(Lock)
글로벌 락
- FLUSH TABLES WITH READ LOCK 명령으로만 획득 가능(해제 UNLOCK TABLES;)
- 하나의 연결 세션에서 글로벌 락을 획득하면 다른 세션에서 SELECT을 제외한 대부분의 DDL, DML 문장이 대기
- 영향은 Mysql 서버 전체
- 대상 테이블, 스키마가 달라도 동일하게 영향을 끼침
- 여러 스키마에 존재하는 MyISAM이나, MEMORY에서 일관된 백업을 받아야 할 때 사용
- 우선 처리되고 있는 트랜잭션이 있다면 글로벌 락이 대기 상태로 기다림
테이블 락
- 테이블 단위로 설정되는 잠금, 명시적 또는 묵시적으로 특정 락을 획득할 수 있다.
- LOCK TABLES 테이블명 [READ | WRITE]를 통해 획득
- MyISAM, InnoDB 엔진을 사용하는 테이블도 동일하게 설정 가능
- InnoDB에선 레코드 락이 제공되기 때문에, 거의 사용 안함(스키마를 변경하는 쿼리 DLL에서 영향을 끼친다.)
유저 락
- GET_LOCK() 하무를 이용해 임의로 잠금을 설정
- 문자열에 대한 잠금을 획득
- 사용법
1.1 - select GET_LOCK('connection_str', 2); #이미 잠금 중이면 2초 대기
1.2 - select GET_LOCK('connection_str); #Lock 획득 성공 시 1, timeout 동안 못 한 경우 0, 오류 발생 시 null
2 - IS_FREE_LOCK('connection_str'); #잠금 설정되어 있는지 확인
3 - IS_USED_LOCK('connection_str'); #문자열이 사용되고 있는지 확인
4 - RELEASE_LOCK ('connection_str'); #문자열에 걸려 있는 잠금을 해제
- 추천 사용 처는 하나의 컬럼을 다수의 프로그램에서 참고할때나 파티션을 사용한 테이블에서 유니크 키로 확인할 때 사용
네임 락
- 스키마 객체(테이블이나 뷰 등)의 이름을 변경하는 경우 획득하는 잠금
- 명시적으로 획득, 해제 하는 것이 아닌 rename table 테이블명 같이 이름을 변경하는 경우 자동으로 획득
- rename 테이블 colum1 to column2, column10 to column11;
경우와 rename 테이블 column1 to column2; rename 테이블 column10 to column11;
락이 다르게 걸려, 아래 경우 조회 시 오류가 날 수도 있다.
'Mysql' 카테고리의 다른 글
Mysql Master Slave 동기화 오류 시 처리 (0) | 2018.10.15 |
---|---|
MyISAM, MEMORY 엔진의 잠금 (0) | 2018.10.12 |
기본 오류 처리 (0) | 2018.10.12 |
저장소 특징 (0) | 2018.10.12 |
mysql sum if 사용 (0) | 2018.10.02 |