DB/이론

트랜잭션 고립 수준에 따른 부정합 문제

로파이 2022. 5. 1. 15:17

트랜잭션 격리 수준 (isolation level)
여러 트랜잭션이 동시에 처리될 때 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있게 허용할지 말지를 결정하는 것이다.

 

부정합 문제

격리 수준에 따라 Dirty Read / Non-Repeatable Read / Phantom Read가 발생할 수 있다.

 

Dirty Read

DIRTY READ

트랜잭션 T1에서 Reika라는 이름을 가진 계정 정보를 INSERT하였다. 

트랜잭션 T2에서는 T1이 COMMIT을 하기 전에 해당 레코드를 읽었다.

트랜잭션 T1이 COMMIT을 완료한다.

 

Dirty Read 현상에서는 한 트랜잭션에서 변경한 사항을 아직 COMMIT하기 전임에도 불구하고 다른 트랜잭션에서 읽을 수 있는 것을 말한다. 이러한 현상을 허용하는 격리수준은 READ UNCOMMITED이다.

 

Non-Repeatable Read

Non-Repeatable Read

트랜잭션 T1을 시작하고 account_id=30000인 레코드를 검색한다. 이는 Reika라는 이름을 가진 레코드가 검색된다.

트랜잭션 T2에서 account_id=30000인 레코드의 이름을 Mable로 변경한다.

트랜잭션 T1에서 다시 레코드를 읽으면 이름이 변경된 값으로 조회된다.

 

Non-Repeatable Read는 단일 트랜잭션 내에서 번복된 조회의 결과가 다르게 나타나는 부정합 현상이다.

다른 트랜잭션의 UPDATE/INSERT/DELETE에 의해 발생한다.

Non-Repeatable Read의 경우 READ COMMITED 격리 수준에서 발생할 수 있다.

 

Phantom Read

Non-Reatable Read

트랜잭션 T1을 시작하고 Mable이라는 이름을 가진 레코드를 검색하지만 존재하지 않는 상태이다.

트랜잭션 T2를 시작하고 Mable이라는 이름을 가진 레코드를 삽입하고 커밋한다.

트랜잭션 T1에서 Mable이라는 이름을 가진 레코드를 검색하면 T2에서 커밋된 레코드를 읽게된다.

 

단일 트랜잭션 내에서 조회 결과가 다르게 나타나는 현상으로 Non-Repeatable Read의 범주로 생각될 수 있다. 

그러나 다른 트랜잭션의 INSERT 혹은 DELETE로 인해 값이 보였다 안보였다하는 조회 결과를 Phantom Read라고 한다.

REPEATABLE READ 격리 수준에서 발생할 수 있다.


여러 격리 수준에 따른 부정합 현상

  DIRTY READ NON-REPEATABLE READ PHANTOM READ
READ UNCOMMITTED 발생 발생 발생
READ COMMITTED 없음 발생 발생
REPEATABLE READ 없음 없음 발생
SERIALIZABLE 없음 없음 없음

 

 

 

'DB > 이론' 카테고리의 다른 글

RDBMS vs NoSQL  (0) 2022.05.02
무결성 제약 조건  (0) 2022.05.02
내부 조인과 외부 조인  (0) 2022.04.30
테이블 정규화  (0) 2022.04.29
클러스터형 인덱스 / 보조 인덱스  (0) 2021.11.29