CS/데이터베이스

트랜잭션 격리 수준 (Transaction Isolation Level)

sun._.ny 2022. 7. 23. 22:20

* 트랜잭션(Transaction)이란?

  • 데이터베이스의 상태를 변화시키기 위해 수행하는 작업 단위
  • 트랜잭션은 원자성(Atomicity), 일관성(Consistency), 격리성(Isolation), 지속성(Durability)을 보장

 

 

 

 

 

 

 

* 트랜잭션 격리 수준이란?

  • 동시에 여러 트랜잭션이 처리될 때, 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있도록 허용할지 말지를 결정하는 것
  • `격리성` 과 연관된 개념
  • 동시에 실행되는 트랜잭션들은 서로에게 영향을 미치지 않도록 격리해야 함 (ex. 동시에 같은 데이터 수정 못하도록)
  • 트랜잭션 간에 격리성을 완벽히 보장하려면 동시에 처리되는 트랜잭션을 차례대로 실행을 해야하는데, 그렇게 하면 처리 성능이 안 좋아진다는 문제점이 발생
  • 이러한 문제로 인해 ANSI 표준은 트랜잭션의 격리 수준을 4단계로 나누어 정의

 

 

 

 

 

 

 

* 격리 수준(Isolation Level) 유형

  • READ UNCOMMITTED(커밋되지 않은 읽기)
  • READ COMMITTED(커밋된 읽기)
  • REPEATABLE READ(반복 가능한 읽기)
  • SERIALIZABLE(직렬화 가능)

 

 

 

1) READ UNCOMMITTED (Level 0)

- 각 트랜잭션에서의 변경 내용이 COMMIT이나 ROLLBACK 여부에 상관 없이 다른 트랜잭션이 접근 가능

- 트랜잭션이 처리중이거나, 아직 Commit되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용함

- 예시) 사용자1이 A 데이터를 B 데이터로 변경하는 동안, 사용자2는 아직 완료되지 않은 트랜잭션이지만 B 데이터를 읽을 수 있음

- 트랜잭션에서 처리한 작업이 완료되지 않았음에도 불구하고 다른 트랜잭션에서 볼 수 있게 되는 현상을

더티 리드(Dirty Read)라 하고, 더티 리드가 허용되는 격리 수준이 READ UNCOMMITTED

- READ UNCOMMITTED 격리 수준은 RDBMS 표준에서는 트랜잭션의 격리 수준으로 인정하지 않을 정도로 정합성에 문제가 많은 격리 수준. 따라서 MySQL을 사용한다면 최소 READ COMMITTED 이상의 격리 수준을 사용할 것을 권장

 

 

 

2) READ COMMITTED (Level 1)

- 어떠한 트랜잭션에서 데이터를 변경하더라도 COMMIT이 완료된 데이터만 다른 트랜잭션에서 조회할 수 있음

- 온라인 서비스에서 가장 많이 선택되는 격리 수준. 해당 레벨에서는 더티 리드(Dirty Read)와 같은 현상은 발생하지 않음

- 예시) 사용자1이 A 데이터를 B 데이터로 변경하는 동안, 사용자2는 해당 데이터에 접근이 불가능

- NON-REPEATABLE READ라는 문제가 존재

- 한 트랜잭션에서 같은 쿼리를 두 번 수행할 때 그 사이에 다른 트랜잭션이 값을 수정 또는 삭제하면서 쿼리의 결과가 상이하게 나타나는 일관성이 깨진 현상

 

 

 

3) REPEATABLE READ (Level 2)

트랜잭션 내에서 한 번 조회한 데이터를 반복해서 조회해도 결과는 동일

다른 사용자는 트랜잭션 영역에 해당되는 데이터에 대해 수정이 불가능함

- MySQL의 InnoDB 스토리지 엔진에서 기본적으로 사용되는 격리 수준

- PHANTOM READ (PHANTOM ROW) 문제 발생 가능

- 한 트랜잭션내에서 동일한 쿼리를 두 번 수행했는데, 첫 번째 쿼리에서 존재하지 않던 유령(Phantom) 레코드가 두 번째 쿼리에서 나타나는 현상

 

 

 

4) SERIALIZABLE (Level 3)

- 가장 단순한 격리 수준이면서 가장 엄격한 격리 수준

- 동시 처리 성능도 다른 트랜잭션 격리 수준보다 현저히 떨어짐

- 한 트랜잭션에서 읽고 쓰는 레코드를 다른 트랜잭션에서는 절대 접근할 수 없음

 

 

 

 

레벨을 높게 조정할 수록 발생하는 비용이 증가

※ 격리 수준이 높아질수록 MySQL 서버의 처리 성능이 많이 떨어지는 것은 아님

※ READ UNCOMMITTED는 일반적인 데이터베이스에서는 거의 사용하지 않고, SERIALIZABLE 역시 동시성이 중요한 데이터베이스에서는 거의 사용되지 않음