티스토리 뷰
격리 수준이란, 트랜잭션이 동시에 여러개 발생했을 때, 특정 트랜잭션이 다른 트랜잭션의 변경사항을 볼 수 있게 할지 말지 결정하는 것이다.
크게 READ_UNCOMMITED, READ_COMMITED, REPEATABLE_READ, SERIALIZABLE 4가지가 있다.
1. READ_UNCOMMITED
각 트랜잭션의 변경 내용이 commit, rollback 여부에 관계없이 모두 보인다. (dirty read 발생)
사용하지 말자
2. READ_COMMITED
오라클 DBMS에서 기본으로 사용되는 격리 수준. 온라인 서비스에서 가장 많이 사용된다.
데이터 변경이 일어날 때 언두로그에 원본 데이터가 저장된다. 이 격리 수준에서는 COMMIT되기 전 데이터는 언두 로그에서 백업본을 읽기 때문에 COMMIT이 완료된 데이터만 다른 트랜잭션에서 조회할 수 있다. COMMIT이후에서는 업데이트된 레코드를 읽을 수 있다.
같은 쿼리를 여러번 실행했을 때, 결과가 달라질 수 있다는 점에서 NON-REPEATABLE READ가 발생할 수 있다.
3. REPEATABLE_READ
MySQL InnoDB 스토리지 엔진에서 기본으로 사용되는 격리 수준.
언두 영역의 데이터를 읽는다는 점은 READ_COMMITED와 동일하지만 몇번째 버전까지 들어가냐는 것이 다름.
어떻게 되나? 기본적으로 COMMIT할 때 레코드에는 TRX-ID를 같이 기록한다. 어떤 트랜잭션이 레코드를 조회할 때, 조회하려는 레코드의 TX-ID가 해당 트랜잭션의 ID보다 크면 해당 트랜잭션 이후에 COMMIT된 레코드 라는 의미이므로, 언두로그에서 현재 TX-ID보다 작은 가장큰 TX-ID를 가진 레코드를 읽어온다.
그렇게 되면, 어떤 트랜잭션이 아주 길게 실행 되면 언두로그에는 같은 레코드의 여러 버전을 저장해 둬야하고, 성능이 느려지는 원인이 될 수 있다.
PHANTOM_READ는 발생한다.
언두로그의 레코드에는 락을 걸 수 없다. 따라서 어떤 쿼리가 레코드 락을 필요로 한다면, 언두로그에서는 쿼리 실행이 불가능하기 때문에 원본 레코드에서 실행해야하고 이 과정에서 쿼리 결과가 달라 질 수 있다. (예: SELECT ... FOR UPDATE)
InnoDB에서는 갭락과 넥스트 키 락 덕분에 REPEATABLE_READ에서도 PHANTOM_READ가 발생하지 않는다.
4. SERIALIZABLE
가장 엄격한 격리 수준. 그만큼 동시 처리도 매우 느리다. 굳이 쓸 필요 없음
'Real MySQL 8.0' 카테고리의 다른 글
[Real MySQL 8.0] 7. 데이터 암호화 (1) | 2023.01.24 |
---|---|
[Real MySQL 8.0] 6. 데이터 압축 (1) | 2023.01.21 |
[Real MySQL 8.0] 5. 3 MySQL 스토리지 엔진 잠금 (0) | 2023.01.20 |
[Real MySQL 8.0] 5. 2 MySQL 엔진의 잠금 (0) | 2023.01.20 |
[Real MySQL 8.0] 5. 트랜잭션과 잠금. 5.1 트랜잭션 (0) | 2023.01.17 |