728x90
반응형
5장은 기존에 알고 있던 내용들이 많아서, 개념만 간단히 잡고 MySQL의 InnoDB에서의 특이사항은 어떤 부분인지를 확인해 보았다.
InnoDB에서의 인덱스 레코드를 잠금하는 개념은 처음 알게 되어서, 앞으로 인덱스를 만들 때 이런 내용도 고려해야겠다는 생각이 들었다.
- 잠금(Lock) : 동시성을 제어하기 위한 기능
- 트랜잭션(Transaction) : 데이터 정합성을 보장하기 위한 기능
5.1 트랜잭션
- 개발 시 트랜잭션에서 고려해 볼 사항들
1. 커넥션과 동일하게 꼭 필요한 최소한의 코드에만 적용하는 것이 좋다(로직이 시작된 후에 커넥션을 맺는 것이 아니라, DBMS가 필요하지 않은 작업을 마치고, 필요한 시점의 전에 맺는 것이 좋다).
2. 메일 전송이나 FTP 파일 전송 작업 또는 네트워크를 통해 원격 서버와 통신하는 등과 같은 작업은 어떻게 해서든 DBMS의 트랜잭션 내에서 제거하는 것이 좋다.
3. 트랜잭션으로 묶어야 하는 부분, 분리해야 하는 부분을 파악해서 사용한다.
5.2 MySQL엔진의 잠금
- 글로벌 락 : MySQL서버 전체에 영향을 미치며, 작업 대상 테이블이나 데이터베이스가 다르더라도 동일하게 영향을 미친다. 한 세션에서 글로벌 락을 획득하게 되면 다른 세선에서 SELECT를 제외한 대부분의 DDL, DML 문장을 실행하는 경우 글로벌 락이 해제될 때까지 대기로 남는다(MySQL서버에서는 가급적으로 사용하지 않는 것이 좋다).
- 테이블 락 : 개별 테이블 단위로 설정되는 잠금이며, 명시적 또는 묵시적으로 락을 획득할 수 있다. InnoDB 테이블의 경우 레코드 기반 잠금을 제공하기 때문에 단순 데이터 변경 쿼리로 묵시적인 테이블 락이 설정되지는 않는다.
- 네임드 락 : 사용자가 지정한 문자열에 대해 획득하고 반납하는 잠금. MySQL 8.0버전부터는 다음과 같이 네임드 락을 중첩해서 사용할 수 있게 되었다.
- 메타데이터 락 : 데이터베이스 객체의 이름이나 구조를 변경하는 경우에 획득하는 락
5.3 InnoDB 스토리지 엔진 잠금
- InnoDB 스토리지 엔진은 레코드 기반의 잠금 기능을 제공하여 잠금 정보가 상당히 작은 공간으로 관리되기 때문에 레코드 락이 페이지 락으로, 또는 테이블 락으로 레벨업되는 경우(락 에스컬레이션)는 없다.
- InnoDB에서는 레코드가 아니라 인덱스의 레코드를 잠그기 때문에, 인덱스 설계가 매우 중요하다.
- 잠금 종류
- 레코드 락 : 레코드 자체만을 잠그는 것. InnoDB 스토리지 엔진의 다른 점은 레코드 자체가 아니라 인덱스의 레코드를 잠근다는 점이다.
- 갭 락 : 레코드 자체가 아니라 레코드와 바로 인접한 레코드 사이의 간격만을 잠근다.
- 넥스트 키 락 : 레코드 락과 갭 락을 합쳐 놓은 형태의 잠금.
- 자동 증가 락 : AUTO_INCREMENT 속성을 가진 테이블에 동시에 여러 레코드가 INSERT되는 경우, 해당 레코드가 중복되게 하지 않기 위한 락. INSERT, REPLACE 등과 같이 새로운 레코드를 저장하는 쿼리에서만 필요하다. InnoDB의 다른 잠금과는 달리 트랜잭션과는 관계가 없고, AUTO_INCREMENT 값을 가져오는 순간만 락이 걸렸다가 해제되기 때문에 매우 짧은 시간 잠금이 걸린다. - 잠금이 걸린 경우 MySQL 8.0기준으로 performance_schema테이블을 이용해 잠금과 잠금 대기 순서를 확인할 수 있다. 너무 오래 걸리는 쿼리가 있을 경우, 잠금을 유발하고 있는 프로세스를 종료하면 대기하고 있는 프로세스들이 순차적으로 처리될 수 있다.
5.4 MySQL의 격리 수준
- DIRTY READ : 트랜잭션이 완료되지 않았음에도 다른 트랜잭션에서 변경 내역을 볼 수 있는 현상
- NON-REPEATABLE READ : 한 트랜잭션에서 조회 시점에 따라 다른 결과를 가지고 오는 현상(REPEATABLE READ 정합성에 어긋남)
- PHANTOM READ : 다른 트랜잭션에서 수행한 변경 작업에 의해 레코드가 보였다 보이지 않았다 하는 현상
DIRTY READ | NON-REPEATABLE READ | PHANTOM RAED | 비고 | |
READ UNCOMMITTED | O | O | O | |
READ COMMITTED | X | O | O | Oracle default |
REPEATABLE READ | X | X | O (InnoDB는 발생하지 않음) | InnoDB default |
SERIALIZABLE | X | X | X |
728x90
반응형
'난중일기 > Back' 카테고리의 다른 글
[Real MySQL 8.0] 10장 - 실행 계획 (0) | 2024.03.06 |
---|---|
[Real MySQL 8.0] 8장 - 인덱스 (0) | 2024.02.16 |
[Real MySQL 8.0] 4장 - 아키텍처 (0) | 2024.02.07 |
kafka 알아보기 - 아키텍처, 특징, 장점, RabbitMQ와의 차이점 (1) | 2024.01.25 |
[Real MySQL 8.0] 1~3장 (0) | 2024.01.25 |