[CS] 트랜잭션의 격리 수준 (Transaction Isolation Level)

  1. 정의 : 여러 트랜잭션이 동시에 처리될 때, 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있게 허용할지 여부를 결정하는 것
    1. SERIALIZABLE
    2. REPEATABLE READ
    3. READ COMMITTED
    4. READ UNCOMMITED→ 자동 커밋(Auto Commit)이 false인 상태에서만 발생
      → 격리(고립) 수준이 높은 순서
  1. 트랜잭션 격리 수준에 따라 발생 할 수 있는 문제점
    1. 더티 리드(Dirty Read) : 특정 트랜잭션에 의해 데이터가 변경되었지만, 아직 커밋되지 않은 상황에서 다른 트랜잭션이 해당 변경 사항을 조회할 수 있는 문제를 말함
    2. 반복 불가능한 조회(Non-Repeatable Read) : 같은 트랜잭션 내에서 같은 데이터를 여러 번 조회했을 때 읽어온 데이터가 다른 경우를 의미
    3. 팬텀 리드(Phantom Read) : Non-Repeatable Read의 한 종류로 조회해 온 결과의 행이 새로 생기거나 없어지는 현상

 

3. SERIALIZABLE

  1. 가장 단순하고, 엄격한 격리 수준으로 트랜잭션을 순차적으로 진행시킴
  2. 여러 트랜잭션이 동일한 레코드에 동시 접근할 수 없으므로, 어떠한 데이터 부정합 문제도 발생하지 않음
    → but, 트랜잭션이 순차적으로 처리되어야 하므로 동시 처리 성능이 매우 떨어짐
  3. 순수한 SELECT 작업은 아무런 레코드 잠금 없이 실행되지만, SERIALIZABLE 격리 수준에서는 순수한 SELECT 작업에서도 대상 레코드에 넥스트 키 락을 읽기 잠금(공유락, Shared Lock)으로 검
    → 한 트랜잭션에서 넥스트 키 락이 걸린 레코드를 다른 트랜잭션에서는 절대 추가/수정/삭제할 수 없음
⇒ SERIALIZABLE은 가장 안전하지만 가장 성능이 떨어지므로, 극단적으로 안전한 작업이 필요한 경우가 아니라면 사용해서는 안됨

 

4. REPEATABLE READ

  1. 트랜잭션이 시작되기 전에 커밋된 내용에 대해서만 조회할 수 있는 격리 수준
  2. MySQL에서 기본으로 사용하며, 이 격리 수준에서는 Non-Repeatable Read가 발생하지 않음
  3. 트랜잭션이 완료될 때까지 SELECT문이 사용하는 모든 데이터에 shared lock 이 걸림
  4. SERIALIZABLE과 다르게 행이 추가되는 것을 막지 않아, 팬텀 리드 현상이 발생할 수 있음.

 

5. READ COMMITTED

  1. 커밋이 완료된 트랜잭션의 변경사항만 다른 트랜잭션에서 조회할 수 있도록 허용하는 격리 수준
    → 특정 트랜잭션이 이루어지는 동안 다른 트랜잭션은 해당 데이터에 접근할 수 없음
  2. 특정 트랜잭션에서 데이터가 변경되었으나, 아직 커밋되지 않은 상태라면 다른 트랜잭션에서는 해당 데이터에 접근했을 때 트랜잭션 시작 전 데이터를 읽어옴.
    → 팬텀 리드와 반복 불가능한 조회문제가 발생
    → 커밋이 된 이후에서야 변경된 데이터 값을 읽어올 수 있음

 

6. READ UNCOMMITTED

  1. 커밋이 되지 않은 트랜잭션의 데이터 변경 내용을 다른 트랜잭션이 조회하는 것을 허용하는 격리 수준
  2. 데이터 부정합 문제가 발생할 확률이 높지만, 성능은 가장 빠름
  3. 데이터를 어림잡아 집계하는 등의 연산에서 사용하면 좋음
  4. 데이터베이스의 일관성을 유지하는 것이 불가능함

 

'CS > Database' 카테고리의 다른 글

[CS] 저장 프로시저(Stored Procedure)  (0) 2023.11.01
[CS] Redis  (1) 2023.11.01
[CS] 트랜잭션 (Transaction)  (0) 2023.11.01
[CS] 정규화  (1) 2023.11.01
[CS] 이상, 인덱스  (1) 2023.10.23