공부/DATABASE
[MySQL 8] Lock, Isolation Level
무는빼주세요
2023. 3. 19. 16:44
MySQL의 잠금은 크게 스토리지 엔진과 MySQL 엔진으로 나눌 수 있다.
MySQL 엔진 잠금
- 글로벌 락 : 가장 범위가 큰 잠금이다. 한 세션에서 해당 잠금을 획득할 경우 다른 세션에서는 대부분의 DDL, DML 문장이 블락 당한다(조회 제외). 즉 범위는 MySQL 서버 전체이며 작업 대상 테이블, 카탈로그 DB가 다르더라고 동일하게 영향을 미친다.
- 백업 락 : DB 백업을 위해 글로벌 락보다 좀 더 가볍게 잠금을 획득하는 방법. 백업락이 걸릴 경우 오브젝트의 변경(DDL), REPAIR TABLE, OPTIMIZE TABLE, USER 에 대한 수정 등 정보를 변경할 수 없다. 하지만 데이터의 변경의 경우 허용이 된다 (Log에 기록되므로 해당 로그를 추가로 백업하는 과정을 거치면 백업 셋트를 구성할 수 있다. SQL Server의 풀백업, 로그백업과 같은 느낌)
- 테이블 락 : 개별 테이블 단위로 설정되는 잠금. 스토리지 엔진 차원에서 레코드 기반의 잠금을 제공하기 때문에 단순 데이터 변경 쿼리로 인해 묵시적인 테이블 락이 설정되지는 않는다.
- 네임드 락 : GET_LOCK() 함수를 이용해 임의의 문자열에 대해 잠금을 설정하는 방법. 여러 클라이언트가 상호 동기화를 처리해야 하는 상황에서 효과적이다.
InnoDB 스토리지 엔진 잠금
InnoDB 스토리지 엔진의 경우 레코드 기반의 잠금이다. 또한 information_schema에 INNODB_TRX, LOCKS, LOCK_WAITS 테이블들을 통하여 현재 트랜잭션들의 잠금등 다양한 정보를 조회할 수 있다.
- 레코드 락 : 레코드 자체만을 잠그는 잠금인데 특이한 점은 인덱스의 레코드를 잠근다. (즉 업데이트가 발생할 경우 해당 레코드를 찾기 위해 테이블 전체를 잠그는것이 아닌 적절한 인덱스를 사용하여 해당 인덱스가 조건을 검색하기 위한 범위의 레코드가 락이 걸린다)
- 갭 락 : 레코드와 바로 인접한 레코드 사이의 간격만을 잠그는 락. 레코드 사이에 새로운 레코드가 INSERT되는 것을 제어한다.
- 넥스트 키 락 : 레코드 락과 갭 락을 합쳐 놓은 형태의 잠금.
- 자동 증가 락 : AUTO_INCREMENT 설정된 컬럼에서 사용되는 테이블 수준의 잠금. Insert에서 발생하며 다른 락과는 달리 트랜잭션과 관계 없이 auto_increment 값을 가져오는 순간에 한해서 락이 발생 및 해제된다.
격리수준
DIRTY READ | NON-REPETABLE READ | PHANTOM READ | |
READ UNCOMMITED | O | O | O |
READ COMMITED | X | O | O |
REPETABLE READ | X | X | X |
SERIALIZABLE | X | X | X |