-
MySql Isolation Level(격리수준)공부하기/데이터베이스 2023. 2. 19. 17:27
여러 트랜잭션이 동시에 처리될 때 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있게 허용할지 말지를 결정하는 것
- READ UNCOMMITTED
- DIRTY READ : 어떤 트랜잭션에에서 처리한 작업이 완료되지 않았는데도 다른 트랜잭션에서 볼 수 있는 현상
- 트랜잭션이 아직 커밋되지 않은 다른 트랜잭션의 변경 사항을 읽을 수 있도록 한다.
- 높은 처리량을 보장하지만 데이터 일관성이 보장되지 않는다.
- 거의 사용되지 않는다.
- READ COMMITTED
- 트랜잭션이 다른 트랜잭션이 커밋한 변경 사항을 읽을 수 있도록 하지만, 아직 커밋되지 않은 변경 사항은 읽을 수 없다.
- NON-REPEATABLE READ라는 부정합의 문제가 있음 ( 아래는 예시 )
- a 트랜잭션에서 사원의 이름을 a -> b 로 변경
- b 트랜잭션에서 사원의 이름을 여러번 조회하는 경우 첫번째 요청에는 a로 두번째 요청부터 b 로 조회되는 문제가 발생
- 하나의 작업셋에서 요청한 동일한 쿼리의 결과가 달라지는 문제가 발생함
- REPEATABLE READ
- mysql의 InnoDB 스토리지 엔진에서 기본으로 사용되는 결리 수준
- 트랜잭션 내에서 읽은 모든 데이터에 대해 일관된 값을 보장.
- 트랜잭션 내에서 일관성을 유지해야 하는 경우에 사용
- NON-REPEATABLE READ 문제가 발생하지 않음
- 트랜잭션 작업의 초기 데이터를 언두 로그에 저장하고 에러 발생 시 언두 로그에 저장된 값으로 복원 -> MVCC
- 한 트랜잭션 내에서 여러번 쿼리를 실행하면 항상 같은 결과를 갖는다.
- 트랜잭션이 완료될 때까지 일관된 데이터를 보장
- *Phantom Read를 방지한다.
- SERIALIZABLE
- 가장 높은 격리 수준으로, 모든 트랜잭션이 순차적으로 실행되도록 보장
- 데이터 일관성을 보장하지만 처리량이 감소할 수 있다.
각 격리 수준에는 장단점이 있으므로, 사용하려는 애플리케이션의 요구 사항과 데이터 일관성 요구 사항을 고려하여 격리 수준을 선택해야 합니다. 기본적으로 MySQL은 REPEATABLE READ 격리 수준을 사용합니다.
*Phantom Read
MySQL의 Phantom Read란, 같은 쿼리를 실행했을 때, 한 번에 반환되는 레코드 수가 다른 경우를 말한다.
Phantom Read는 다른 트랜잭션이 실행 중인 상황에서 트랜잭션 A가 특정 범위의 데이터를 조회하고, 그 범위에 해당하는 데이터를 수정, 삭제, 삽입한 후, 동일한 쿼리를 다시 실행할 때 발생합니다. 이 경우, 이전과 다른 결과를 반환할 수 있으며, 이것이 Phantom Read입니다.
'공부하기 > 데이터베이스' 카테고리의 다른 글
[용어] MySql 드라이빙 테이블, 드리븐 테이블 (0) 2023.02.28 mysql 쿼리 실행 절차 (0) 2023.02.19 MySql Database Lock (0) 2023.02.19 다양한 데이터베이스 특징 (0) 2023.02.18 MySQL UNION 요약 (0) 2023.02.10 - READ UNCOMMITTED