본문 바로가기
DB

DB Transaction

by 차가운개발 2024. 10. 4.

 

데이터의 무결성

데이터베이스에서 데이터의 정확성, 일관성, 신뢰성을 보장하는 것을 의미한다. 
트랜잭션은 데이터베이스의 무결성을 보장하는 핵심 매커니즘이다. 

 

트랜잭션은 데이터베이스에서 하나의 작업 단위로 처리되는 일련의 연산들을 의미한다. 트랜잭션은 데이터베이스에 대해 일관성을 유지하면서 여러 작업을 안전하게 수행하기 위한 중요한 개념이다. ACID 특성을 기반으로 하여 데이터의 무결성과 신뢰성을 보장한다.

 

개념

1. 데이터베이스에서 수행되는 하나 이상의 작업을 모아 하나의 논리적인 작업 단위로 취급하는 것

 

2. 모든 작업이 성공해야만 트랜잭션이 완료되고 그 결과가 데이터베이스에 반영됨

 

3. 트랜잭션 내의 작업 중 하나라도 실패하면 전체 작업이 취소(롤백)되어 데이터베이스의 상태가 트랜잭션이 시작되기 전으로 돌아감

 

ACID 특성

  1. 원자성(Atomicity)
    모든 작업이 완전히 수행되거나 전혀 수행되지 않아야 한다.
  2. 일관성(Consistency)
    트랜잭션은 데이터베이스의 일관된 상태를 유지해야한다. 실행되기 전과 후의 데이터베이스는 일관성이 있는 상태여야한다.(트랜잭션이 완료된 후에도 데이터베이스의 규칙(무결성 제약 조건 등)이 유지되어야 한다.)
  3. 고립성(Isolation)
    각 트랜잭션은 독립적으로 실행되어야하며, 다른 트랜잭션의 중간 결과에 영향을 받지 않아야 한다. 동시에 실행되는 트랜잭션들이 서로 간섭하지 않고 독립적으로 처리되어야 하며 영향을 주지 않아야 한다.
  4. 지속성(Durability)
    트랜잭션이 완료된 후의 결과는 영구적으로 반영되어야 한다.

 

트랜잭션의 상태

트랜잭션은 실행 과정에서 다양한 상태를 가질 수 있다.

  • Active(활성)
    트랜잭션이 실행중인 상태
  • Partially Committed(부분적으로 커밋됨)
    트랜잭션이 마지막 연산을 수행했지만 아직 커밋되지 않은 상태
  • Committed(커밋됨)
    트랜잭션이 성공적으로 완료되어 영구적으로 반영된 상태
  • Failed(실패)
    트랜잭션이 실패하여 더 이상 진행할 수 없는 상태
  • Aborted(중단됨)
    트랜잭션이 실패하여 롤백된 상태. 데이터베이스는 트랜잭션이 시작되기 전으로 복구된다.

 

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

트랜잭션이 서로 독립적으로 실행되도록 보장하기 위해 격리 수준을 정의한다. 각 격리 수준은 성능과 일관성의 균형을 맞추는 방식에 차이가 있다.

 

1. Read Uncommitted

  • 다른 트랜잭션이 아직 커밋하지 않은 데이터를 읽을 수 있다.
  • 가장 낮은 수준의 격리를 제공하며, Dirty Read(더티 읽기) 문제가 발생할 수 있다.

2. Read Committed

  • 다른 트랜잭션이 커밋한 데이터만 읽을 수 있다.
  • Dirty Read를 방지하지만, Non-repeatable Read(비반복 읽기)가 발생할 수 있다.

3. Repeatable Read

  • 트랜잭션 내에서 같은 데이터를 여러 번 읽을 때 항상 동일한 결과를 보장한다.
  • Non-repeatable Read를 방지하지만, Phantom Read(팬텀 읽기)가 발생할 수 있다.

4. Serializable

  • 가장 높은 수준의 격리를 제공하며, 트랜잭션이 완벽하게 독립적으로 처리된다.
  • 성능이 떨어질 수 있지만, 모든 문제를 방지한다.

* Dirty Read
커밋되지 않은 데이터를 다른 트랜잭션이 읽는 상황을 말한다. 한 트랜잭션이 완료되지 않은 상태에서 수정된 데이터를 다른 트랜잭션이 읽을 수 있어 나중에 원래 트랜잭션이 롤백되면 데이터를 읽은 트랜잭션의 결과가 잘못된 것이 된다.

 

* Non-repeatable Read
같은 트랜잭션 내에서 동일한 데이터를 두 번 이상 읽을 때 그 값이 달라지는 문제를 말한다. 트랜잭션이 진행되는 도중 다른 트랜잭션이 그 데이터를 수정하거나 삭제하여 발생한다.

 

* Phantom Read
한 트래잭션이 범위 쿼리(여러 행을 포함한 조회)를 수행한 후 다른 트랜잭션이 데이터를 삽입 또는 삭제하여 그 범위 내의 데이터가 변하는 상황을 말한다. 이로 인해 동일한 쿼리를 수행했을 때 데이터의 수가 달라지는 경우가 발생할 수 있다.

'DB' 카테고리의 다른 글

DB Key  (0) 2024.10.04
DB SQL Injection  (0) 2024.10.04
DB Index  (0) 2024.10.04
DB Redis  (0) 2024.10.04
DB SQL & NoSQL  (0) 2024.10.04