Database

트랜잭션 격리 수준의 종류와 성능 최적화 전략

백엔드 유성 2023. 9. 2. 20:11

트랜잭션과 격리 수준

 

데이터베이스에서 트랜잭션과 격리 수준은 데이터의 무결성을 유지하고 동시성을 관리하는 중요한 개념입니다.

 

트랜잭션이란?

트랜잭션은 데이터베이스의 상태를 변화시키기 위해 실행되는 프로그램의 단위 작업입니다. 트랜잭션은 다음과 같은 ACID 속성을 만족해야 합니다.

  • A : Atomicity 원자성을 의미하며, 트랜잭션 내의 모든 연산은 하나의 작은 단위로 동작해야 합니다. 쉽게말해 모든 연산이 실패하거나, 모든 연산이 성공하거나 둘 중 하나만 처리되도록 해야합니다.
  • C : Consistency 일관성을 의미하며, 트랜잭션은 데이터 일관성 상태에서 다른 일관된 상태로 전환해야 합니다. 예를 들면 "학생"이라는 데이터가 테이블에서 삭제된다면 "수강신청"이라는 학생에 Relation 되어있는 데이터가 삭제된 후 "학생"이라는 데이터를 삭제해야 합니다.
  • I : Isolation 고립성을 의미하여, 하나의 트랜잭션의 실행은 다른 트랜잭션에게 영향을 주지 않아야 합니다. 고립성과 고립성 level에 대해서는 아래에서 추가로 설명합니다.
  • D : Durablity 영속성을 의미하며, 트랜잭션이 성공적으로 완료되면, 그 결과는 영구적으로 반영되어야 합니다.

 

격리(고립) 수준이란?

격리 수준은 데이터베이스에서 여러 트랜잭션이 동시에 실행될 때, 트랜잭션들간에 서로 어떻게 영향을 주고 받을지를 정의합니다.

 

격리 수준은 다음과 같습니다. (수준은 1 < 2 < 3 < 4 순서로 1이 가장 낮은 수준의 격리입니다.)

  1. Read Uncommitted : 다른 트랜잭션에서 커밋되지 않은 데이터를 읽을 수 있습니다.
  2. Read Committed : 다른 트랜잭션에서 커밋된 데이터만 읽을 수 있습니다.
  3. Repeatable Read : 트랜잭션이 시작된 후 다른트랜잭션이 값을 변경하고 커밋을 하더라도 기존 트랜잭션에서는 변경 전의 처음값만 읽을 수 있습니다.
  4. Serializable : 가장 엄격한 수준의 격리를 제공합니다. 트랜잭션은 순차적으로 실행됩니다.

 

격리 수준에 따라 발생할 수 있는 문제들이 있습니다.

  1. Dirty Read : 다른 트랜잭션에서 커밋이 되지 않았음에도 그 트랜잭션에서 변경된 값을 읽는 문제입니다.
  2. Non Repeatable Read : 하나의 트랜잭션 내에서 같은 쿼리의 결과가 다르게 나오는 문제입니다.
  3. Phantom Read : 하나의 트랜잭션 내에서 쿼리의 결과 개수가 달라지는 문제입니다.

 

위 문제들은 Serializable 수준에서 모두 해결되지만, 성능적인 측면을 고려해야 합니다.

 

트랜잭션과 격리 수준은 데이터베이스에서 데이터의 무결성과 동시성을 관리하는 데 중요한 역할을 합니다. 적절한 격리 수준을 선택하는 것은 성능과 데이터의 안정성 사이에서 중요한 균형을 이루는 데 도움을 줍니다.


감사합니다.