DB Transaction Isolation Level

개념

트랜잭션 격리수준(isolation level) 이란 동시에 여러 트랜잭션이 처리될 때, 트랜잭션끼리 얼마나 서로 고립되어 있는지를 나타낸 것이다.

즉, 특정 트랜잭션이 다른 트랜잭션에 변경한 데이터를 볼 수 있도록 허용할지 말지를 결정한다.

데이터베이스는 ACID 특징과 같이 트랜잭션이 독릭적인 수행을 하도록 Locking을 통해, 트랜잭션이 DB를 다루는 동안 다른 트랜잭션이 관려하지 못하도록 막는 것이 필요하다.

하지만 무조건 Locking으로 동시에 수행되는 수많은 트랜잭션들을 순서대로 처리하는 방식으로 구현하게 되면 데이터 베이스의 성능은 떨어지게 된다.

하지만, 성능을 높이기 위해 Locking의 범위를 줄인다면, 잘못된 값이 처리될 문제가 발생 할 수 있다.

따라서 최대한 효율적인 Locking 방법이 필요하다.

Isolation level 종류

Read Uncommitted (레벨 0)

  1. SELECT 문장이 수행되는 동안 해당 데이터에 Shared Lock이 걸리지 않는 계층
  2. 트랜잭션에 처리중이거나, 아직 Commit되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용함
  3. 데이터베이스의 일관성을 유지하는 것이 불가능함
  4. Dirty Read 발생
    • A트랜잭션에서 10번 사원의 나이를 27에서 28로 바꿈. 아직 커밋하지 않음
    • B트랜잭션에서 10번 사원의 나이를 조회 : 결과 28 -> 더티 리드(Dirty Read)
    • 이 이후, A트랜잭션에서 문제가 발생해 Rollback함
    • B 트랜잭션은 10번 사원이 여전히 28살이라 생각하고 로직을 수행함
    • 이런식으로 데이터 정합성에 문제가 많아짐

Read Committed (레벨 1)

  1. SELECT 문장이 수행되는 동안 해당 데이터에 Shared Lock이 걸리는 계층
  2. 트랜잭션이 수행되는 동안 다른 트랜잭션이 접근할 수 없어 대기하게 됨
  3. Commit 이 이루어진 트랜잭션만 조회 가능
  4. Oracle DB, SQL Server에서 기본으로 사용하는 Isolation Level임
  5. Non-Repeatable Read 발생
    • B트랜잭션에서 10번 사원의 나이를 조회 : 결과 27
    • A트랜잭션에서 10번 사원의 나이를 27에서 28로 바꾸고 커밋
    • B트랜잭션에서 10번 사원으 나이를 조회 : 결과 28

Repeatable Read (레벨 2)

  1. 트랜잭션이 완료될 때까지 SELECT 문장이 사용되는 모든 데이터에 Shared Lock이 걸리는 계층
  2. 트랜잭션이 범위 내에서 조회한 데이터 내용이 항상 동일함을 보장함
  3. 다른 사용자는 트랜잭션에 영역에 해당되는 데이터에 대한 수정 불가능
  4. MySQL DBMS에서 기본으로 사용함
  5. Non-Repeatable Read 부정합이 발생하지 않음
    • 10번 트랜잭션이 500번 사원을 조회
    • 12번 트랜잭션이 500번 사원의 이름을 변경하고 커밋
    • 10번 트랜잭션이 500번 사원을 다시 조회 : undo 영역에 백업된 데이터 반환
  6. 즉, 자신의 트랜잭션 번호보다 낮은 트랜잭션 번호에서 변경된(커밋된) 것만 보게 된다.
    • 모든 InnoDB의 트랜잭션은 순차적으로 증가하는 고유한 트랜잭션 번호를 갖고 있으며,
    • undo 영역에 백업된 모든 레코드는 변경을 발생시킨 트랜잭션의 번호를 포함하고 있다.
  7. Phantom Read 발생

Serializable (레벨 3)

  1. 트랜잭션이 완료될 때까지 SELECT 문장이 사용되는 모든 데이터에 Shared Lock이 걸리는 계층
  2. 가장 엄격한 격리 수준으로 완벽한 읽기 일관성 모드를 제공함
  3. 다른 사용자는 트랜잭션 영역에 해당되는 데이터에 대한 수정 및 입력 불가능

레벨이 높아질 수록 트랜잭션간 고립 정도가 높아지며, 성능이 떨어지는 것이 일반적이며,

일반적인 온라인 서비스에서는 READ COMMITTED나 REPEATABLE READ 중 하나를 사용한다.

(Oracle = READ COMMITTED, MySQL = REPEATABLE READ)

선택 시 고려사항

Isolation Level에 대한 조정은, 동시성과 데이터 무결성에 연관되어 있다.

동시성을 증가시키면 데이터 무결성에 문제가 발생하고, 데이터 무결성을 유지하면 동시성이 떨어지게 된다.

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

낮은 단계 Isolation Level을 활용할 때 발생하는 현상들

Dirty Read

Non-Repeatable Read

Phantom Read

Isolation Level Dirty Read Non-Reapeatable Read Phantom Read
Read Uncommitted O O O
Read committed - O O
Repetable Read - - O
Serializable - - -

원문링크

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